NullPointerException 使用 Mockitos 参数化测试传递输入

问题描述 投票:0回答:1
@ExtendWith(MockitoExtension.class)
public class MyServiceTest
{
   @Mock
   private static MyRepository myRepository;
   private MyService myService;

   @BeforeEach
   void setUp()
   {
      myService = new MyService(myRepository);
   }

@ParameterizedTest
   @ArgumentsSource(TestParameter.class)
   void findAllTest(Map<String, String> allParamaters, List<Element> methodCall) throws JsonProcessingException
   {

      Element element = Element.builder().identification("id").build();

      when(methodCall).thenReturn(List.of(element));

      var expectedResponse = myService.excute(allParamaters);

      //assert....;
   }

   private static class TestParameter implements ArgumentsProvider
   {
      @Override
      public Stream<? extends Arguments> provideArguments(ExtensionContext context)
      {
         return Stream.of(
                  Arguments.of(Map.of("key_1", "value_2", myRepository.findComponentByKey_1(....)),
                  Arguments.of(Map.of("key_1", "value_2", myRepository.findComponentByKey_2(....)),
         );
      }
   }

我在

myRepository
中收到
provideArguments(ExtensionContext context)
的 NullPointerException。

java junit mockito parameter-passing junit5
1个回答
0
投票

您正在使用 myRepository.findComponentByKey_1()

构建您的参数流,但此时您的存储库尚未初始化。

首先,您的 TestParameter 类将被初始化以传递给函数。它会在 @Mock 注释用于模拟存储库实例之前发生

然后你的存储库将由@Mock初始化

然后你的 @BeforeEach 函数将会触发

最后你的测试函数将被调用

我希望这能为您解决问题。

编辑:

您可以使用注释 @BeforeAll 添加另一个函数,它需要是静态的,然后您需要在其中手动模拟您的存储库 它应该可以工作,因为 @BeforeAll 函数将在生成参数源之前触发

myRepository = mock(MyRepository.class);
© www.soinside.com 2019 - 2024. All rights reserved.