为什么使用Mock注解会出现NPE
Why do I have NPE when using Mock annotation
我正在研究如何使用 Mockito 和 Junit,现在正在测试一些片段。我不明白为什么我在 Mock 注释后的以下代码中有 NPE:
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest{
@Test
public void whenNotUseMockAnnotation() {
List mockList = mock(ArrayList.class);
mockList.add("one");
verify(mockList).add("one");
assertEquals(0, mockList.size());
when(mockList.size()).thenReturn(100);
assertEquals(100, mockList.size());
}
@Mock
List <String> mockedList;
@Test
public void whenUseMockAnnotation() {
mockedList.add("one");
verify(mockedList).add("one");
assertEquals(0, mockedList.size());
when(mockedList.size()).thenReturn(100);
assertEquals(100, mockedList.size());
}
}
但是代码的第一部分工作正常,尽管据我了解两部分都在做同样的事情。
已编辑:
堆栈跟踪:
java.lang.NullPointerException
在 com.foxminded.decoratortest.DecoratorTest.whenUseMockAnnotation(DecoratorTest.java:39)
在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.base/java.lang.reflect.Method.invoke(Method.java:564)
在 org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
在 org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
在 org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
在 org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)
在 org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124)
在org.junit.jupiter.engine.extension.TimeoutExtension.intercept测试方法(TimeoutExtension.java:74)
在 org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
在 org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
在 org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
在 org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
在 org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
在 org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
在 org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
在 org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202)
在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198)
在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $5(NodeTestTask.java:135)
在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $8(NodeTestTask.java:123)
在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
在 java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行$5(NodeTestTask.java:139)
在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $8(NodeTestTask.java:123)
在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
在 java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行$5(NodeTestTask.java:139)
在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $8(NodeTestTask.java:123)
在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
在 org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
在 org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
在 org.junit.platform.launcher.core.DefaultLauncher.lambda$执行 $6(DefaultLauncher.java:197)
在 org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137)
在 org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
在 org.eclipse.jdt.internal.junit.运行ner.TestExecution.运行(TestExecution.java:41)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:542)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:770)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行(RemoteTestRunner.java:464)
在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.main(RemoteTestRunner.java:210)
替换
@RunWith(MockitoJUnitRunner.class)
有
@ExtendWith(MockitoExtension.class)
它就像一个魅力。
@RunWith 适用于 Junit4,而@ExtendWith 适用于 Junit5。
我正在研究如何使用 Mockito 和 Junit,现在正在测试一些片段。我不明白为什么我在 Mock 注释后的以下代码中有 NPE:
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest{
@Test
public void whenNotUseMockAnnotation() {
List mockList = mock(ArrayList.class);
mockList.add("one");
verify(mockList).add("one");
assertEquals(0, mockList.size());
when(mockList.size()).thenReturn(100);
assertEquals(100, mockList.size());
}
@Mock
List <String> mockedList;
@Test
public void whenUseMockAnnotation() {
mockedList.add("one");
verify(mockedList).add("one");
assertEquals(0, mockedList.size());
when(mockedList.size()).thenReturn(100);
assertEquals(100, mockedList.size());
}
}
但是代码的第一部分工作正常,尽管据我了解两部分都在做同样的事情。
已编辑: 堆栈跟踪:
java.lang.NullPointerException 在 com.foxminded.decoratortest.DecoratorTest.whenUseMockAnnotation(DecoratorTest.java:39) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:564) 在 org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675) 在 org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) 在 org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125) 在 org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132) 在 org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:124) 在org.junit.jupiter.engine.extension.TimeoutExtension.intercept测试方法(TimeoutExtension.java:74) 在 org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) 在 org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) 在 org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104) 在 org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62) 在 org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43) 在 org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35) 在 org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) 在 org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:202) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:198) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) 在 org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $5(NodeTestTask.java:135) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $8(NodeTestTask.java:123) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行$5(NodeTestTask.java:139) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $8(NodeTestTask.java:123) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行$5(NodeTestTask.java:139) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) 在 org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$递归执行 $8(NodeTestTask.java:123) 在 org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) 在 org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) 在 org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) 在 org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) 在 org.junit.platform.launcher.core.DefaultLauncher.lambda$执行 $6(DefaultLauncher.java:197) 在 org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) 在 org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137) 在 org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98) 在 org.eclipse.jdt.internal.junit.运行ner.TestExecution.运行(TestExecution.java:41) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:542) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行 测试(RemoteTestRunner.java:770) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.运行(RemoteTestRunner.java:464) 在 org.eclipse.jdt.internal.junit.运行ner.RemoteTestRunner.main(RemoteTestRunner.java:210)
替换
@RunWith(MockitoJUnitRunner.class)
有
@ExtendWith(MockitoExtension.class)
它就像一个魅力。
@RunWith 适用于 Junit4,而@ExtendWith 适用于 Junit5。