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

NullPointerException Parameterized Test passing input using Mockitos

提问人:emoleumassi 提问时间:9/1/2023 最后编辑:emoleumassi 更新时间:9/1/2023 访问量:55

问:

@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(....)),
         );
      }
   }

我在 中得到一个 NullPointerException 。myRepositoryprovideArguments(ExtensionContext context)

java junit mockito 参数传递 junit5

评论


答:

1赞 Morph21 9/1/2023 #1

您正在使用 myRepository.findComponentByKey_1()

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

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

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

然后你的@BeforeEach函数将触发

最后,您的测试函数将被调用

我希望这能为你澄清一些事情。

编辑:

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

myRepository = mock(MyRepository.class);