我无法访问MyClass2
代码,也无法更改它。我如何模拟/示例化MyClass2 myClass2
?
类和代码测试:
@RunWith(JUnit4.class)//can't change thisone
public class MyTest
{
@Autowired // or not, tried both ways
MyClass testedInstance= new MyClass();
@Test
public void boot() throws Exception{
testedInstance.boot();
assertTrue(true);
}
}
public class MyClass
{
@Autowired
private MyClass2 myClass2;
void boot()
{
myClass2.foo();//getting a null pointer here
}
}
3条答案
按热度按时间1cklez4t1#
首先,您需要使用以下内容对测试类进行注解:
然后关于MyClass:
您需要删除
= new MyClass();
,因为您正在对其进行自动布线。然后,由于现在您正在注入
MyClass
,因此如果有MyClass2的可注入示例,则将其注入MyClass中,如果没有,则不会注入。您需要配置应用程序上下文以使这样的beanMyClass2存在,
c2e8gylq2#
你可以查一下原来的答案
https://stackoverflow.com/a/71591567/5108695
但这是一个很常见的问题,所以我也把答案贴在这里
在我看来,我们正在编写单元测试用例,我们不应该为了测试一段代码而初始化Spring上下文。
所以,
我使用Mockito来模拟我的主目标测试类中的
Autowired
bean,并将这些模拟bean注入到我的主测试类Object中可能听起来令人困惑,请参见以下示例💥
我使用的依赖项
我的主要类是数学和计算器bean是自动连接的
测试类
现在,
cal
在Maths类中将不为空,并将按预期工作jfgube3f3#
如果您在测试中使用实现类进行自动配置,但操作代码使用的是一个接口 *,并且存在代理 *,这可能会发生。例如,如果您使用Spring Security中的
@PreAuthorize
注解,或者Spring AOP中的切入点,这可能会发生。我不能100%确定CGLIB代理是否会发生这种情况,但JDK代理肯定会发生这种情况。您必须获得完全正确的Bean,否则将无法正常工作,并且由于正在测试的Bean处于半配置状态,您将获得非常奇怪(“不可能”)的空指针异常。