我正在尝试测试一个类,当它扩展另一个类时,这需要我定义一个隐式构造函数。
public class MyCustomHandler extends SomeHandler {
@Autowired
private Object1 object1;
@Autowired
private Object2 object2;
public MyCustomHandler (String name, ServicesManager servicesManager,
PrincipalFactory principalFactory, Integer order) {
super(name, servicesManager, principalFactory, order);
}
public boolean doSomething () {
object1.foo(); // <- object1 is null here when testing
}
//Some other override methods
}
//Test class
@ExtendWith(MockitoExtension.class)
class CustomAzureAuthenticationHandlerTest {
@Mock
Object1 object1 ;
@Mock
Object2 object2 ;
@InjectMocks
MyCustomHandler myCustomHandler;
//Test methods
@Test
void doSomeTest() {
when(object1.doSomething()).thenReturn(false);
myCustomHandler.someMethod();
}
}
当调用我的真实类中正在测试的方法时,它正在调用
object1.foo()
并且 object1
是 null
。
我知道这可能是由于没有无参数/默认构造函数,并且它使用了我被迫实现的隐式构造函数,它没有创建我的模拟对象。我只是不知道如何解决这个问题。
为了解决这个问题,你可以在每次测试之前使用@BeforeEach注解手动实例化MyCustomHandler,传入mock对象。 JUnit 5 中的 @BeforeEach 注释允许您在每次测试之前运行一些初始化代码。
@ExtendWith(MockitoExtension.class)
class CustomAzureAuthenticationHandlerTest {
@Mock
Object1 object1;
@Mock
Object2 object2;
MyCustomHandler myCustomHandler;
@BeforeEach
void setUp() {
// Manually instantiate MyCustomHandler with mock dependencies
myCustomHandler = new MyCustomHandler("name", mock(ServicesManager.class), mock(PrincipalFactory.class), 0);
myCustomHandler.object1 = object1;
myCustomHandler.object2 = object2;
}
@Test
void doSomeTest() {
when(object1.foo()).thenReturn(false);
myCustomHandler.doSomething();
// Add your assertions here
}
}