Spring Boot JUnit test beanFactory.getBean空指针异常 &g



我有一个函数,我试图通过JUnit测试,但我无法找到如何克服这个问题:

在服务中我有这样的声明:

Warning_Log Warning_Log_FRAGMENT = beanFactory.getBean(Warning_Log.class);

我尝试在测试类中声明beanFactory对象与@MockBean注释,但我得到一个空指针异常。

在蛋糕上的樱桃是我正在测试的函数是私有的,所以我使用反射来访问它。

你知道如何在junit测试函数中实现beanFactory(Warning_Log.class)吗?

编辑服务中的代码如下:

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在类的开头声明如下:

@MockBean
private BeanFactory beanfactory;

假设您有以下类:

@Service
public class MyClass {
@Autowired
private BeanFactory beanFactory;
/*
* Some more code
*/
}

然后您要为该类创建一些单元测试,例如:

@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容器在它被注入的任何地方使用你的模拟类。

最新更新