我正在尝试为 MyClass 中的方法编写单元测试,该方法创建 DependentClass 的实例并调用其方法 dependentMethod。在我的测试中,我想重写 dependentMethod 的行为,以便它返回 false 而不是 true。
这是 MyClass 和 DependentClass 的代码:
public class MyClass {
public boolean myMethod() {
DependentClass dependentObject = new DependentClass();
return dependentObject.dependentMethod();
}
}
class DependentClass {
public boolean dependentMethod() {
// Original behavior
return true;
}
}
这是我尝试使用 Mockito 和 TestNG 的测试代码:
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class MyClassTest {
@Mock
private DependentClass dependentClassMock;
@InjectMocks
private MyClass myClass;
@BeforeMethod
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testMyMethod() {
// Arrange
Mockito.when(dependentClassMock.dependentMethod()).thenReturn(false);
// Act
boolean result = myClass.myMethod();
// Assert
Assert.assertFalse(result);
}
}
但是,这并不能按预期工作,因为 dependentMethod 在测试过程中仍然返回 true。我怀疑这是因为 myMethod 中创建的 DependentClass 实例不是模拟实例。
如何正确模拟 DependentClass,以便 dependentMethod 在 myMethod 中调用时返回 false?有没有一种方法可以在不显着重构 MyClass 的情况下实现这一目标?
预先感谢您的帮助!
感谢发布此链接的人: Junit 本地对象模拟
这就是我根据那篇文章更改测试类的方法:
import org.mockito.*;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.mockito.Mockito.mockConstruction;
import static org.testng.AssertJUnit.*;
public class MyClassTest {
@Mock
private MyClass myClass;
@BeforeMethod
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testMyMethod() {
MyClass myClassTest = new MyClass();
assertTrue(myClassTest.myMethod());
System.out.println("Original behaviour: " + myClassTest.myMethod());
try (MockedConstruction<DependentClass> dependentClassMockedConstruction = mockConstruction(DependentClass.class,
(mock, context) -> {
Mockito.when(mock.dependentMethod()).thenReturn(false);
})){
MyClass myClass = new MyClass();
System.out.println("Inside of try block: " + myClass.myMethod());
}
}
}