Spring 启动 JUnit 测试 beanFactory.getBean 空指针异常
Spring Boot JUnit test beanFactory.getBean null pointer exception
我有一个功能正在尝试通过 JUnit 进行测试,但我找不到解决此问题的方法:
在服务中我有这个声明:
Warning_Log Warning_Log_FRAGMENT = beanFactory.getBean(Warning_Log.class);
我尝试在测试 class 中使用 @MockBean 注释声明 beanFactory 对象,但出现空指针异常。
锦上添花的是我正在测试的函数是私有的,所以我正在使用反射来访问它。
你知道beanFactory(Warning_Log.class)在junit测试函数中是如何实现的吗?
编辑
服务中的代码如下:
try {
JSONObject jsonFragmentRequestWarning_Log = new JSONObject();
jsonFragmentRequestWarning_Log.put("messaggio", "Create Session Blocked [Assertion="+policy.getString("name")+"]|[flag_block_create_session="+gateway.flag_block_create_session+"]|[ApplicationName="+Request.getHeader("ApplicationName")+"]|[ErroreDaRitornare="+erroreDaRitornare+"]");
jsonFragmentRequestWarning_Log.put("sanitize", false);
Warning_Log Warning_Log_FRAGMENT = beanFactory.getBean(Warning_Log.class);
String sFragmentResponseWarning_Log = Warning_Log_FRAGMENT.warning_Log(jsonFragmentRequestWarning_Log.toString(), httpHeaders);
JSONObject jsonFragmentResponseWarning_Log = new JSONObject(sFragmentResponseWarning_Log);
}
beanFactory 像这样在服务中自动装配:
@Autowired
private BeanFactory beanFactory;
编辑 2
这是我在导致空指针异常的 junit 函数中尝试的:
Field bf = clazz.getClass().getDeclaredField("beanFactory");
bf.setAccessible(true);
bf.set(clazz, beanfactory);
而beanfactory在class开头声明如下:
@MockBean
private BeanFactory beanfactory;
假设您有以下 class:
@Service
public class MyClass {
@Autowired
private BeanFactory beanFactory;
/*
* Some more code
*/
}
然后您想为 class 创建一些单元测试,例如:
@RunWith(SpringRunner.class)
public class MyClassTest {
@MockBean
private BeanFactory beanFactoryMock;
@Autowired
private MyClass myClass;
@Test
public void testMyClass() {
// Since we have annotated our BeanFactory with @MockBean
// this is now the instance that will be used by our class-under-test
Mockito.when(beanFactoryMock.getBean(Warning_Log.class))
.thenReturn(...);
}
这是大意。如果您有一个受依赖注入影响的字段,则不必使用反射来在单元测试中访问它。 MockBean
注释将告诉 IoC 容器在任何被注入的地方使用你模拟的 class。
我有一个功能正在尝试通过 JUnit 进行测试,但我找不到解决此问题的方法:
在服务中我有这个声明:
Warning_Log Warning_Log_FRAGMENT = beanFactory.getBean(Warning_Log.class);
我尝试在测试 class 中使用 @MockBean 注释声明 beanFactory 对象,但出现空指针异常。
锦上添花的是我正在测试的函数是私有的,所以我正在使用反射来访问它。
你知道beanFactory(Warning_Log.class)在junit测试函数中是如何实现的吗?
编辑
服务中的代码如下:
try {
JSONObject jsonFragmentRequestWarning_Log = new JSONObject();
jsonFragmentRequestWarning_Log.put("messaggio", "Create Session Blocked [Assertion="+policy.getString("name")+"]|[flag_block_create_session="+gateway.flag_block_create_session+"]|[ApplicationName="+Request.getHeader("ApplicationName")+"]|[ErroreDaRitornare="+erroreDaRitornare+"]");
jsonFragmentRequestWarning_Log.put("sanitize", false);
Warning_Log Warning_Log_FRAGMENT = beanFactory.getBean(Warning_Log.class);
String sFragmentResponseWarning_Log = Warning_Log_FRAGMENT.warning_Log(jsonFragmentRequestWarning_Log.toString(), httpHeaders);
JSONObject jsonFragmentResponseWarning_Log = new JSONObject(sFragmentResponseWarning_Log);
}
beanFactory 像这样在服务中自动装配:
@Autowired
private BeanFactory beanFactory;
编辑 2 这是我在导致空指针异常的 junit 函数中尝试的:
Field bf = clazz.getClass().getDeclaredField("beanFactory");
bf.setAccessible(true);
bf.set(clazz, beanfactory);
而beanfactory在class开头声明如下:
@MockBean
private BeanFactory beanfactory;
假设您有以下 class:
@Service
public class MyClass {
@Autowired
private BeanFactory beanFactory;
/*
* Some more code
*/
}
然后您想为 class 创建一些单元测试,例如:
@RunWith(SpringRunner.class)
public class MyClassTest {
@MockBean
private BeanFactory beanFactoryMock;
@Autowired
private MyClass myClass;
@Test
public void testMyClass() {
// Since we have annotated our BeanFactory with @MockBean
// this is now the instance that will be used by our class-under-test
Mockito.when(beanFactoryMock.getBean(Warning_Log.class))
.thenReturn(...);
}
这是大意。如果您有一个受依赖注入影响的字段,则不必使用反射来在单元测试中访问它。 MockBean
注释将告诉 IoC 容器在任何被注入的地方使用你模拟的 class。