3

我查看了论坛,但找不到为什么会发生这种情况

我有

public class AImpl implements A{

   @Autowired
   B bImpl;

   protected void doSomething(){
      String s = "test";
      String d = b.permuteString(s);
      System.out.println(s.substring(1));
   }

}

public class BImpl implements B{
    public String permuateString(s){
     return s;
   }
}

在测试中我有:

@InjectMocks
AImpl aImpl;

@Mock
BImpl bImpl;

@Test
public void testCode(){
testCode(){
   aImpl.doSomething();
}
}

permuateStringfrom的方法BImpl总是返回 null。我需要知道 permuteString() 的结果才能继续执行 doSomething。所以它不能为空

为什么?

我在用Mockito

4

2 回答 2

9

通过用 注释该BImpl字段@Mock,您是在说实例本身应该是一个模拟。但是,您并没有告诉 Mockito 在使用参数调用时模拟应该给出什么结果,因此 Mockito 使用其返回 null 的默认行为。

具有真实行为的真实类这一事实BImpl是无关紧要的。该字段不包含该类的实例;它包含一个模拟实例。

在你的测试方法中,在你调用之前aImpl.doSomething(),告诉 mockito 你期望它使用的行为:

when(bImpl.permuteString("test")).thenReturn("someOtherValue");
于 2013-05-19T13:07:30.887 回答
1

很可能,进入您的B实例的实例也是一个模拟(我不知道它是模拟还是模拟)。@AutowiredAImplBBImpl

在任何一种情况下,任何模拟的默认存根方法都可能会返回null,除非你另有说明(除非你告诉stub它)。

我不能确定(除非我运行自己的测试),但我可以说它会帮助您简单地添加日志语句(或使用调试器)来验证是否:

a.) 包含什么值AImpl#b(是 aBImpl还是 mock B)?

b.) 是否BImpl#permuateString()被调用。

c.)BImpl#permuateString()获得什么价值s

于 2013-05-19T13:07:31.147 回答