@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。
您正在使用 myRepository.findComponentByKey_1()
构建您的参数流,但此时您的存储库尚未初始化。
首先,您的 TestParameter 类将被初始化以传递给函数。它会在 @Mock 注释用于模拟存储库实例之前发生
然后你的存储库将由@Mock初始化
然后你的 @BeforeEach 函数将会触发
最后你的测试函数将被调用
我希望这能为您解决问题。
编辑:
您可以使用注释 @BeforeAll 添加另一个函数,它需要是静态的,然后您需要在其中手动模拟您的存储库 它应该可以工作,因为 @BeforeAll 函数将在生成参数源之前触发
myRepository = mock(MyRepository.class);