当前位置: 首页 > 知识库问答 >
问题:

为什么我不能在使用PowerMockRunner运行时使用@InjectMocks字段匹配?

卢志行
2023-03-14

下面是正在测试的类:

    import java.util.Date;
    public class Parent{

    private Date dateA;
    private Date dateB;

    public void setDateA(Date _dateA){
       dateA = _dateA;
    }

    public void setDateB(Date _dateB){
       dateB = _dateB;
    }

    public Date getDateA(){
       return dateA;
    }

    public Date getDateB(){
       return dateB;
    }

下面是测试本身:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest({System.class, Parent.class})
    public class testParent{

    @Mock (name = "dateB")  private Date someOtherDate;
    @Mock (name = "dateA")  private Date someDate;    

    @InjectMocks Parent p;

    @Before
    public void setup(){
        Mockito.when(someOtherDate.getTime()).thenReturn(500l);
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.currentTimeMillis()).thenReturn(2000l);
    }

    @Test
    public void testGetDateAGetTimeShouldReturn1000() {
        Mockito.when(someDate.getTime()).thenReturn(1000l);
        Date result = p.getDateA();
        assertEquals(1000l, result.getTime());
    }

    @Test
    public void testGetDateBGetTimeShouldReturn500() {
        Date result = p.getDateB();
        assertEquals(500l, result.getTime());   
    }

测试时,由于@InjectMocks不工作,这两个AsserteQuals都会导致NullPointerException

我正在运行junit4.12、mockito-all-1.10.19和powermock-mockito-1.6.2-full。

有没有人知道为什么它不能用PowerMockRunner.class正确注入的原因?在使用PowerMockRunner.Class运行时,是否有解决此问题的方法?

共有1个答案

郎宣
2023-03-14

如果要使用PowerMockRunner,则必须调用MockitoAnnotations.initMocks()来初始化使用注释创建的模拟。

但是,有几个很好的理由完全不使用injectmocks。一般来说,您对如何设置测试的控制较少。最好只调用new并手动传入参数。此外,如果有任何问题,莫基托将只是默默地失败。参见本文更多内容:

Mockito将尝试按照如下所述,仅通过构造函数注入、设置器注入或属性注入来注入模拟。如果以下任何一种策略失败,那么Mockito不会报告失败;即您必须自己提供依赖项。

 类似资料:
  • 问题内容: 我想清除并更改给定URL上的输入值。我使用的js不会执行任何操作,也不会导致任何错误。为什么会发生这种情况,我该如何解决? 问题答案: 一个可能且可能的答案是,在尝试清除的元素之前,您还有另一个具有相同名称的元素。 请检查html并检查是否找到多个元素,然后采用第一个。 另外,您可以使用css选择器,例如:

  • 我的问题是为什么找不到“name”字段?

  • 从TensorArray读取: 使用: 问题: 回溯(最近一次调用last):RLU培训中第130行的文件“\main.py”。train()文件“C:\Users\user\Documents\Projects\rl toolkit\rl_training.py”,第129行,在train self中_rpm,赛尔夫。批量大小,自行确定。梯度步数,记录步数b=self。在call result=

  • 我正在尝试使用文件系统。我的< code>CMakeLists.txt中有< code>-std=c 11 -std=c 1y。GCC版本为4.9.2。然而,我得到了一个错误: 使用的正确方法是什么?

  • 下面是一个多态字段: 其中是接口,是结构/类中其他位置的字段。 在这种情况下我怎么会有这种行为呢?

  • 问题内容: 在下面的代码中,为什么我需要导入但可以不导入就可以使用? 问题答案: 为了方便起见,Java编译器会为每个源文件自动导入两个完整的软件包: java.lang包和 当前包(当前文件的包)。 请参考 oracle.com了解更多信息(http://docs.oracle.com/javase/tutorial/java/package/usepkgs.html)