当我为 Junit 测试中的接口 @Autowired 时获取 null
Getting null when I @Autowired for the interface in Junit Test
我正在为此方法编写 JUnit 测试 processData
- 我正在 Junit 中执行 @Autowired
Cache mycache
,并在我的测试方法下模拟 Cache mycache
。当我这样做时 mycache = mock(Cache.class)
- 这个 returns Junit 方法中的某个对象但是当我从 Junit 调用我的实际方法时 Cache mycache
在 Main
[=38= 中变为 null ].请在下面找到代码:
我在这里遗漏了什么 - 如何解决这个 NullPointer 异常问题 - 为什么当从 Junit 触发实际方法时 mycache 变为 null - 虽然我已经模拟了这个对象。任何帮助将非常感激。谢谢!
Main.Java
import com.github.benmanes.caffeine.cache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Main {
@Autowired
Cache mycache;
public Product processData(String productId) {
System.out.println("productId value: " +productId);
System.out.println("mycache value: " +mycache);
Product product = (Product) mycache.getIfPresent(productId); //getting NullPointer exception here
if (product != null) {
return product;
}
// do some processing
return product;
}
}
MainTest.Java
public class MainTest {
@Autowired
Cache mycache;
@Test
public void processDataTest() throws Exception {
Main main = new Main();
mycache = mock(Cache.class);
System.out.println("mycache: " + mycache.toString()); // Mock for Cache, hashCode: 3244883
when(mycache.getIfPresent("9393939")).thenReturn(null);
Product product = main.processData("9393939");
assertNotNull(product);
}
}
异常日志跟踪:
mycache: Mock for Cache, hashCode: 3244883
productId value: 9393939
mycache value: null
java.lang.NullPointerException
at com.test.processData(Main.java:122)
at com.test.MainTest.processDataTest(MainTest.java:161)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
如果你的测试用例中有 @Autowired
一个 class 你不应该模拟它。您需要使用 @Mock
注释 Cache 字段,否则您将无法模拟 Cache.class.
您在 processData 中得到 null 的原因是 Cache 对象是自动装配的而不是模拟的。
java.lang.NullPointerException
at com.test.processData(Main.java:122)
你能试试下面的代码吗,
public class MainTest {
@Mock
Cache mycache;
@Test
public void processDataTest() throws Exception {
Main main = new Main();
// mycache = mock(Cache.class);
System.out.println("mycache: " + mycache.toString()); // Mock for Cache, hashCode: 3244883
when(mycache.getIfPresent("9393939")).thenReturn(null);
Product product = main.processData("9393939");
assertNotNull(product);
}
}
而不是做:
@Component
public class Main {
@Autowired
Cache mycache;
...
通过构造函数注入:
@Component
public class Main {
private final Cache mycache;
public Main(Cache mycache) {
this.mycache = mycache;
}
}
现在开始测试,您可以创建 Main
的实例,您可以在其中提供 Cache
.
的 mock
我正在为此方法编写 JUnit 测试 processData
- 我正在 Junit 中执行 @Autowired
Cache mycache
,并在我的测试方法下模拟 Cache mycache
。当我这样做时 mycache = mock(Cache.class)
- 这个 returns Junit 方法中的某个对象但是当我从 Junit 调用我的实际方法时 Cache mycache
在 Main
[=38= 中变为 null ].请在下面找到代码:
我在这里遗漏了什么 - 如何解决这个 NullPointer 异常问题 - 为什么当从 Junit 触发实际方法时 mycache 变为 null - 虽然我已经模拟了这个对象。任何帮助将非常感激。谢谢!
Main.Java
import com.github.benmanes.caffeine.cache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Main {
@Autowired
Cache mycache;
public Product processData(String productId) {
System.out.println("productId value: " +productId);
System.out.println("mycache value: " +mycache);
Product product = (Product) mycache.getIfPresent(productId); //getting NullPointer exception here
if (product != null) {
return product;
}
// do some processing
return product;
}
}
MainTest.Java
public class MainTest {
@Autowired
Cache mycache;
@Test
public void processDataTest() throws Exception {
Main main = new Main();
mycache = mock(Cache.class);
System.out.println("mycache: " + mycache.toString()); // Mock for Cache, hashCode: 3244883
when(mycache.getIfPresent("9393939")).thenReturn(null);
Product product = main.processData("9393939");
assertNotNull(product);
}
}
异常日志跟踪:
mycache: Mock for Cache, hashCode: 3244883
productId value: 9393939
mycache value: null
java.lang.NullPointerException
at com.test.processData(Main.java:122)
at com.test.MainTest.processDataTest(MainTest.java:161)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
如果你的测试用例中有 @Autowired
一个 class 你不应该模拟它。您需要使用 @Mock
注释 Cache 字段,否则您将无法模拟 Cache.class.
您在 processData 中得到 null 的原因是 Cache 对象是自动装配的而不是模拟的。
java.lang.NullPointerException
at com.test.processData(Main.java:122)
你能试试下面的代码吗,
public class MainTest {
@Mock
Cache mycache;
@Test
public void processDataTest() throws Exception {
Main main = new Main();
// mycache = mock(Cache.class);
System.out.println("mycache: " + mycache.toString()); // Mock for Cache, hashCode: 3244883
when(mycache.getIfPresent("9393939")).thenReturn(null);
Product product = main.processData("9393939");
assertNotNull(product);
}
}
而不是做:
@Component
public class Main {
@Autowired
Cache mycache;
...
通过构造函数注入:
@Component
public class Main {
private final Cache mycache;
public Main(Cache mycache) {
this.mycache = mycache;
}
}
现在开始测试,您可以创建 Main
的实例,您可以在其中提供 Cache
.