【问题标题】:Testing a passed in value.. not just the returned value测试传入的值.. 不仅仅是返回值
【发布时间】:2011-05-12 20:32:37
【问题描述】:

所以我有一个看起来像这样的类。

@Inject
AnotherClass anotherClass;

public class Foo {
    public Boolean someMethod(){
         Holder<Boolean> booleanHolder = new Holder<Boolean>();
         //I have no control over this method, but I need it to set booleanHolder
         anotherClass.anotherMethodCall(booleanHolder, Boolean.TRUE);

         return booleanHolder.value;  
    }
}

我想做的是测试方法。这似乎几乎是不可能的。我有 anotherClass 嘲笑。但我只能告诉传入的是什么变量。或者告诉另一个方法调用应该返回什么。

我想要做的是能够设置 booleanHolder 在方法被调用后将是什么。

有什么想法吗?

【问题讨论】:

  • 你到底在测试哪种方法?
  • 不返回 Holder 对象,我认为你不能。

标签: java unit-testing mockito


【解决方案1】:

Holder 类是否有一个访问器(可能是模板化的),以便您可以在调用后获取它持有的值,然后针对该值执行 assert()?我假设您有一个“外部”方法的测试版本,它使用“通过引用”仿真参数调用另一个方法。

【讨论】:

    【解决方案2】:

    我的问题实际上是我使用 mockito 的方式。我指向了错误的值。如果有人好奇这是如何工作的。

    public void test_someMethod(){
        Foo myClass = new Foo();
        AnotherClass mockClass = mock(AnotherClass.class);
        final Boolean testBool;
        when(anotherClass.anotherMethodCall((Holder)anyObject(),anyBoolean()).thenAnswer(new Answer(){
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    Object[] args = invocation.getArguments();
                    Holder<Boolean> newHolder = (Holder<Boolean>) args[0];
                    newHolder.value = testBool;
                }
            }
    
         Boolean retBool = myClass.someMethod();
    
         assertTrue(retBool);
     }
    

    出于显而易见的原因,这并不是我正在做的事情。但这是一个很好的概括案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2020-11-25
      • 1970-01-01
      相关资源
      最近更新 更多