Java 如何在不使用@injectmocks的情况下注入mock

Java 如何在不使用@injectmocks的情况下注入mock,java,unit-testing,testing,mocking,mockito,Java,Unit Testing,Testing,Mocking,Mockito,我有以下课程 public class One { private Map<String, String> nodes = new HashMap<String, String>(); public void addNode(String node, String nodefield){ this.nodes.put(node, nodefield); } } 公共一级{ 私有映射节点=新HashMap(); 公共void ad

我有以下课程

public class One {
    private Map<String, String> nodes = new HashMap<String, String>();

    public void addNode(String node, String nodefield){
        this.nodes.put(node, nodefield);
    }
}
公共一级{
私有映射节点=新HashMap();
公共void addNode(字符串节点、字符串节点字段){
this.nodes.put(node,nodefield);
}
}
我想编写一个测试类来测试addNode方法,并具有以下功能:

@RunWith(MockitoJUnitRunner.class)
public class OneTest {
    @InjectMocks
    private One one = new One();

    @Mock
    Map<String, String> nodes;

    @Test
    public void testAddNode(){
        one.addNode("mockNode", "mockNodeField");
        Mockito.verify(nodes).put("mockNode","mockNodeField");
    }
}
@RunWith(MockitoJUnitRunner.class)
公共类网络测试{
@注射模拟
私有的一个=新的一个();
@嘲弄
地图节点;
@试验
public void testAddNode(){
一个.addNode(“mockNode”、“mockNodeField”);
验证(节点).put(“mockNode”,“mockNodeField”);
}
}
这很有效。但是我想知道是否有一种不使用@InjectMock的方法可以做到这一点,如下所示

public class OneTest {

    private One one;

    @Test
    public void testAddNode(){
        Map<String, String> nodes = Mockito.mock(Map.class);

        one = Mockito.injectmocks(One.class, nodes); // or whatever equivalent methods are

        one.addNode("mockNode", "mockNodeField");
        Mockito.verify(nodes).put("mockNode","mockNodeField");
    }
}
公共类OneTest{
私家车;
@试验
public void testAddNode(){
Map节点=Mockito.mock(Map.class);
one=Mockito.injectmocks(one.class,nodes);//或任何等效方法
一个.addNode(“mockNode”、“mockNodeField”);
验证(节点).put(“mockNode”,“mockNodeField”);
}
}

如何通过将映射作为依赖项注入来更改类?这使得测试更容易,并使您能够使用映射接口的实现,例如:

  public class One {

    private Map<String, String> nodes;

    public One(Map<String, String> nodes) {

        this.nodes = nodes;

    }

    public void addNode(String node, String nodefield){

        this.nodes.put(node, nodefield);

    }
}

好吧,我用PowerMockito而不是普通的Mockito解决了这个问题

public class OneTest {

    private One one;

    @Test
    public void testAddNode(){
        HashMap nodes = PowerMockito.mock(HashMap.class);
        PowerMockito.whenNew(HashMap.class).withNoArguments().thenReturn(nodes);


        One one = new One(); 

        one.addNode("mockNode", "mockNodeField");
        Mockito.verify(nodes).put("mockNode","mockNodeField");
    }
}

然而,我真的不知道PowerMockito做了什么,Mockito没有做什么来让它工作。

是的,我也想到了。但我实际上是在为一个不是我写的类编写测试。该类已经设置了构造函数。上面的代码只是实际类的一个更简单的解释版本。那么,在不更改原始类的情况下,是否无法为addNode方法编写测试?您真正需要的是一个反射实用程序来访问私有属性。一旦你获得访问权限,你就可以使用间谍或模拟。Spy更好,因为您只想关注一个实例。如果仍然使用1.x版本,Mockito有内部类Whitebox。如果您碰巧使用Spring,Spring会一直进行反射。我最近重新研究了这个问题,发现ReflectionTestUtils是一个更好的解决方案。我在这里找到了一本很好的读物,希望与大家分享:。我试图远离PowerMock,因为我读到它不是最佳实践。谢谢你的信息!
public class OneTest {

    private One one;

    @Test
    public void testAddNode(){
        HashMap nodes = PowerMockito.mock(HashMap.class);
        PowerMockito.whenNew(HashMap.class).withNoArguments().thenReturn(nodes);


        One one = new One(); 

        one.addNode("mockNode", "mockNodeField");
        Mockito.verify(nodes).put("mockNode","mockNodeField");
    }
}