提问人:emoleumassi 提问时间:9/1/2023 最后编辑:emoleumassi 更新时间:9/1/2023 访问量:55
NullPointerException 参数化测试使用 Mockitos 传递输入
NullPointerException Parameterized Test passing input using Mockitos
问:
@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 。myRepository
provideArguments(ExtensionContext context)
答:
1赞
Morph21
9/1/2023
#1
您正在使用 myRepository.findComponentByKey_1()
构建参数流,但此时存储库尚未初始化。
首先,将初始化 TestParameter 类以传递到函数中。这将在@Mock注释用于模拟存储库的实例之前发生
然后,您的存储库将由 @Mock 初始化
然后你的@BeforeEach函数将触发
最后,您的测试函数将被调用
我希望这能为你澄清一些事情。
编辑:
您可以添加另一个带有注释的函数@BeforeAll它需要是静态的,然后在其中手动模拟您的存储库 它应该可以工作@BeforeAll因为函数会在生成参数源之前触发
myRepository = mock(MyRepository.class);
评论