Junit5 和模拟,空对象

问题描述 投票:0回答:1

我正在尝试测试一个类,当它扩展另一个类时,这需要我定义一个隐式构造函数。

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

我知道这可能是由于没有无参数/默认构造函数,并且它使用了我被迫实现的隐式构造函数,它没有创建我的模拟对象。我只是不知道如何解决这个问题。

java mockito junit5
1个回答
0
投票

为了解决这个问题,你可以在每次测试之前使用@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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.