在使用Junit进行测试期间,@Autowired字段为空,我如何模拟/示例化它?

hjzp0vay  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(313)

我无法访问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
    }
}
1cklez4t

1cklez4t1#

首先,您需要使用以下内容对测试类进行注解:

@RunWith( SpringJUnit4ClassRunner.class )

然后关于MyClass:

@Autowired 
MyClass testedInstance;

您需要删除= new MyClass();,因为您正在对其进行自动布线。
然后,由于现在您正在注入MyClass,因此如果有MyClass2的可注入示例,则将其注入MyClass中,如果没有,则不会注入。
您需要配置应用程序上下文以使这样的beanMyClass2存在,

c2e8gylq

c2e8gylq2#

你可以查一下原来的答案
https://stackoverflow.com/a/71591567/5108695
但这是一个很常见的问题,所以我也把答案贴在这里
在我看来,我们正在编写单元测试用例,我们不应该为了测试一段代码而初始化Spring上下文。
所以,
我使用Mockito来模拟我的主目标测试类中的Autowired bean,并将这些模拟bean注入到我的主测试类Object中
可能听起来令人困惑,请参见以下示例💥
我使用的依赖项

testImplementation("org.mockito:mockito-core:2.28.2")
    testImplementation("org.mockito:mockito-inline:2.13.0")
    testImplementation("org.junit.jupiter:junit-jupiter:5.8.2")
    testImplementation("org.mockito:mockito-junit-jupiter:4.0.0")

我的主要类是数学和计算器bean是自动连接的

class Maths{

   @Autowired Calculator cal;

   .........
   .........

   public void randomAddMethod(){
      cal.addTwoNumbers(1,2); // will return 3;
   }
}

测试类

@ExtendWith(MockitoExtension.class)

class MathsTest{

   @Mock(answer = Answers.RETURNS_DEEP_STUBS) Calculator cal;

   @InjectMocks Maths maths = new Maths();

   @Test testMethodToCheckCalObjectIsNotNull(){
      maths.randomAddMethod();
   }
}

现在,cal在Maths类中将不为空,并将按预期工作

jfgube3f

jfgube3f3#

如果您在测试中使用实现类进行自动配置,但操作代码使用的是一个接口 *,并且存在代理 *,这可能会发生。例如,如果您使用Spring Security中的@PreAuthorize注解,或者Spring AOP中的切入点,这可能会发生。我不能100%确定CGLIB代理是否会发生这种情况,但JDK代理肯定会发生这种情况。
您必须获得完全正确的Bean,否则将无法正常工作,并且由于正在测试的Bean处于半配置状态,您将获得非常奇怪(“不可能”)的空指针异常。

相关问题