【发布时间】:2020-08-24 18:29:51
【问题描述】:
我是 Junit 和 Mockito 的新手。所以,我在使用 Mockito 时遇到了 Null PointerException ,由于 @InjectMocks,所以看到一篇文章显示使用
摆脱 @InjectMocks SomeBusinessImpl businessImpl;
@BeforeEach
void setUP() {
final int numberOfElements = 10;
int[] createdData = (new CreateData()).getCreatedData(numberOfElements);
when(dataServiceMock.retreiveAllData()).thenReturn(createdData);
businessImpl = new SomeBusinessImpl(dataServiceMock);
}
但这不起作用。它再次在第 3 行抛出 NullPointerException when(dataServiceMock.retreiveAllData()).thenReturn(createdData);
我的堆栈跟踪
java.lang.NullPointerException
at com.floatanddouble.mockitodemo.SomeBusinessImplMockAnnotationsTest.setUP(SomeBusinessImplMockAnnotationsTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:125)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:132)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptLifecycleMethod(TimeoutExtension.java:111)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptBeforeEachMethod(TimeoutExtension.java:67)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:104)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:62)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:43)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:35)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeMethodInExtensionContext(ClassBasedTestDescriptor.java:464)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$synthesizeBeforeEachMethodAdapter$16(ClassBasedTestDescriptor.java:449)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachMethods$2(TestMethodTestDescriptor.java:159)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeMethodsOrCallbacksUntilExceptionOccurs$5(TestMethodTestDescriptor.java:187)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:187)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachMethods(TestMethodTestDescriptor.java:156)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(Unknown Source)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(Unknown Source)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137)
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
而且由于这不起作用。我的 SomeBusinessImplMockAnnotationsTest 类中有很多冗余代码
package com.floatanddouble.mockitodemo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
class SomeBusinessImplMockAnnotationsTest {
@Mock
DataService dataServiceMock;
// @InjectMocks - Does not inform of the failure, and NullPointerException is thrown cause InjectMocks can
// can only inject mocks using setter injection, or constructor injection.
// SomeBusinessImpl businessImpl;
// @BeforeEach
// void setUP() {
// final int numberOfElements = 10;
// int[] createdData = (new CreateData()).getCreatedData(numberOfElements);
// when(dataServiceMock.retreiveAllData()).thenReturn(createdData);
// businessImpl = new SomeBusinessImpl(dataServiceMock);
// }
@Test
void testFndTheGreatestFromAllData() {
final int numberOfElements = 10;
int[] createdData = (new CreateData()).getCreatedData(numberOfElements);
DataService dataServiceMock = mock(DataService.class);
when(dataServiceMock.retreiveAllData()).thenReturn(createdData);
SomeBusinessImpl businessImpl = new SomeBusinessImpl(dataServiceMock);
int expectedResult = businessImpl.findTheGreatestFromAllData();
when(businessImpl.getData()).thenReturn(createdData);
int actualResult = (new GetActualResult()).getActualResult(businessImpl.getData());
assertEquals(expectedResult , actualResult);
}
@Test
void testFndTheGreatestFromAllDataTwoElement() {
final int numberOfElements = 2;
int[] createdData = (new CreateData()).getCreatedData(numberOfElements);
DataService dataServiceMock = mock(DataService.class);
when(dataServiceMock.retreiveAllData()).thenReturn(createdData);
SomeBusinessImpl businessImpl = new SomeBusinessImpl(dataServiceMock);
int expectedResult = businessImpl.findTheGreatestFromAllData();
when(businessImpl.getData()).thenReturn(createdData);
int actualResult = (new GetActualResult()).getActualResult(businessImpl.getData());
assertEquals(expectedResult , actualResult);
}
@Test
void testFndTheGreatestFromAllDataForSingleElement() {
final int numberOfElements = 1;
int[] createdData = (new CreateData()).getCreatedData(numberOfElements);
DataService dataServiceMock = mock(DataService.class);
when(dataServiceMock.retreiveAllData()).thenReturn(createdData);
SomeBusinessImpl businessImpl = new SomeBusinessImpl(dataServiceMock);
int expectedResult = businessImpl.findTheGreatestFromAllData();
when(businessImpl.getData()).thenReturn(createdData);
int actualResult = (new GetActualResult()).getActualResult(businessImpl.getData());
assertEquals(expectedResult , actualResult);
}
}
class GetActualResult{
public int getActualResult(int[] data) {
int actualResult = Integer.MIN_VALUE;
for(int element : data)
actualResult = Math.max(actualResult, element);
return actualResult;
}
}
class CreateData{
public int[] getCreatedData(int numberOfElements) {
int[] createdData = new int[numberOfElements];
for(int i = 0; i < numberOfElements; i++) {
createdData[i] = (int)(Math.random()*100);
}
return createdData;
}
}
SomeBusinessImpl 类
package com.floatanddouble.mockitodemo;
public class SomeBusinessImpl {
private DataService dataService;
private int[] data;
public SomeBusinessImpl(DataService dataService) {
this.dataService = dataService;
data = this.dataService.retreiveAllData();
}
public int[] getData() {
return data;
}
int findTheGreatestFromAllData() {
int greatest = Integer.MIN_VALUE;
for(int i : data) {
if(i > greatest)
greatest = i;
}
return greatest;
}
}
interface DataService{
int[] retreiveAllData();
}
请帮忙。 提前谢谢你。
【问题讨论】:
-
你用
@RunWith(MockitoJUnitRunner.class)注释你的测试类了吗? -
即使添加了@RunWith(MockitoJUnitRunner.class),问题仍然存在。我添加了 JUnit4 库和必要的东西来让程序运行,但是 setUP 的第 3 行仍然抛出 NullPoiterException。请帮助,任何帮助将不胜感激。
标签: java junit nullpointerexception mockito