为了账号安全,请及时绑定邮箱和手机立即绑定

具有Mockito的Environment的JUnit模拟无法正常工作,仍然评估为null

具有Mockito的Environment的JUnit模拟无法正常工作,仍然评估为null

慕尼黑的夜晚无繁华 2021-04-09 14:15:49
我有一个类MyClass拥有@Autowired private Environment env;它。它还具有在public MyFunctionA()中调用的private MyFunctionB()和MyFunctionB(),在中调用env.getProperty(propName),它将从属性文件返回一个字符串值MyFunctionA()作为其计算的一个因素。但是目前,在调试JUnit测试时,如果没有,我将无法模拟环境null。单元测试类MyServiceTest为MyClass开始列如下:public class MyServiceTest {    @Mock     final Environment env = Mockito.mock(Environment.class);    MyServiceImpl myService;    @Before    public void setUp() throws Exception {       Mockito.when(this.env.getProperty("myProperty")).thenReturn("1234,2345");        myService = new MyServiceImpl();稍后,在单元测试功能中,它会调用,MyFunctionA()但调试显示MyFunctionB()在进行env.getProperty调用时会遇到NPE 。有什么事吗 测试看起来像这样:@Testpublic void myUnitTest() throws IOException {    boolean boolFlag = myService.MyFunctionA();    assertTrue(boolFLag);}
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这里有两个问题:


您可以通过为@Mock显式分配一个新的(模拟的)值来覆盖由注释创建的模拟对象env。

您缺少将@InjectMocks模拟内容注入env到您的myService成员的注释:



public class MyServiceTest {


    @Mock 

    Environment env; // issue #1


    @InjectMocks // issue #2

    MyServiceImpl myService = new MyServiceImpl()


    @Before

    public void setUp() throws Exception {

       Mockito.when(this.env.getProperty("myProperty")).thenReturn("1234,2345");

    }


    // Tests ...


查看完整回答
反对 回复 2021-04-21
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

您的对象创建过程中有很多问题。但是,如果您依赖Mockito中的注释,则需要使用运行器MockitoJUnitRunner或调用来初始化对象MockitoAnnotations.initMocks(this);


最终配置:


public class MyServiceTest {


@Mock 

Environment env;


@InjectMocks

MyServiceImpl myService;


@Before

public void setUp() throws Exception {

   MockitoAnnotations.initMocks(this);

   Mockito.when(this.env.getProperty("myProperty")).thenReturn("1234,2345");

}


// Tests ...


查看完整回答
反对 回复 2021-04-21
  • 2 回答
  • 0 关注
  • 419 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信