当前位置: 首页 > 知识库问答 >
问题:

如何告诉Mockito Mock注释返回一个不为空的模拟对象?

令狐唯
2023-03-14

我正在尝试对一个方法进行单元测试,根据在其中创建的对象的值,该方法有不同的分支。下面的代码演示了它。

public class AClass {

public void method2() {
  //Some code goes here
}
public void method1(BClass bObject) {
    C_Class cObject = bObject.someMethodThatReturnsC();
    if(cObject != null) {
        method2();
        method2();
    }
}}

下面是TestClass:

public class AClassTest {
@InjectMocks
AClass AClassSpy;

@Mock
BClass b_objectMock;

@Mock
C_Class c_objectMock;

@BeforeMethod
public void beforeMethod() {
  AClassSpy = spy(new AClass());      
  MockitoAnnotations.initMocks(this);
}

public void method1Test () {
    doReturn(c_objectMock).when(b_objectMock).someMethodThatReturnsC());
    AClassSpy.method1(b_objectMock);
    verify(AClassSpy, times(2).method2();
}
}

但是,它总是失败,因为c_objectMock始终为空。我该怎么做才能告诉Mockito不要返回空对象?

共有2个答案

夏侯昊明
2023-03-14

您之所以出现这种行为,是因为您没有模仿对someMethodThatReturnsC的属性调用。

应该是:

doReturn(c_objectMock).when(b_objectMock).someMethodThatReturnsC();
苏乐
2023-03-14

它工作得很好,只需使用jUnit中的@前注解,而不是@Before方法,并将您的测试方法标记为@test并从
do的第二个括号中删除(c_objectMock)。当(b_objectMock)。

这应该行得通:

public class AClassTest {

  @InjectMocks
  private AClass AClassSpy;

  @Mock
  private BClass b_objectMock;

  @Mock
  private C_Class c_objectMock;

  @Before
  public void beforeMethod() {
      AClassSpy = spy(new AClass());
      MockitoAnnotations.initMocks(this);
  }

  @Test
  public void method1Test() {
      doReturn(c_objectMock).when(b_objectMock).someMethodThatReturnsC();
      AClassSpy.method1(b_objectMock);
      verify(AClassSpy, times(2)).method2();
  }

}

您可以使用注释@RunWith代替 before 方法。它看起来很清楚:

@RunWith(MockitoJUnitRunner.class)
public class AClassTest {

  @Spy
  @InjectMocks
  private AClass AClassSpy;

  @Mock
  private BClass b_objectMock;

  @Mock
  private C_Class c_objectMock;

  @Test
  public void method1Test() {
      doReturn(c_objectMock).when(b_objectMock).someMethodThatReturnsC();
      AClassSpy.method1(b_objectMock);
      verify(AClassSpy, times(2)).method2();
  }

}

 类似资料:
  • 问题内容: 因此,我正在像这样在类级别上将模拟对象创建为静态变量…在一个测试中,我想返回某个值,而在另一个测试中,我希望它返回一个不同的值。我遇到的问题是,似乎我需要重建模拟才能使其正常工作。我想避免重建模拟,只在每个测试中使用相同的对象。 在第二个测试中,当调用testObj.bar()时,我仍然收到0作为值。解决此问题的最佳方法是什么?请注意,我知道我可以在每个测试中使用不同的模拟,但是,我必

  • 然后,在我的测试中,我执行调用的代码。而测试就是在那条线上失败了。我做错了什么?

  • 如何模拟返回已强制转换的模拟对象的方法。 试验方法。

  • 问题内容: 我有一个文件夹,其中包含index.js和几个模型(类)index.js book.js author.js 问题在于Author类似乎找不到书!它只是一个空对象。但是,如果我在index.js中切换导出,则将Book放在Author之后- 可以,但是其他模型将停止工作。 我不想做任何骇客工作。 问题答案: 这是因为您具有循环依赖关系。Node.js以非常特定的方式处理此问题: 第一个

  • 在python 3.x中,通常使用函数的返回类型注释,例如: “void”类型的正确注释是什么? 我正在考虑三种选择: