如何在junit测试中调用包含在实现接口的类中的私有方法?

时间:2016-02-12 11:27:45

标签: java interface nodes private thrift

编辑:如果帖子被认为过于混乱,我很抱歉,我会编辑它并只留下有关我的问题的部分...

我写了一个名为" ArithmeticNode"的类。它实现了一个包含以下方法的接口:

public void turnOn() {
  arithmeticServer.start();
} 

public void turnOff(){
  arithmeticServer.stop();
}

并且还包含一个私有方法:

private void negotiatePort(NodeManifest nodeManifest, ThriftServer arithmeticServer) {
    while(true) {
        int proposedPort = arithmeticServer.start();
        int returnedPort = managementClient.registerNode(nodeManifest, proposedPort);
        if(proposedPOrt != returnedPort) {
            arithnemticServer.stop();
        }
        else
            break;
    }
}

我尝试做的是编写一个测试,在其中我创建了许多这些算术节点,并使它们注册到我已编写并用作服务器的管理节点。然后我的项目的第二部分将使这些节点进行交互,但这不是实际问题的一部分。 我已经写了一个有效的junit测试:

@Test
public void testArithmeticServer() throws Exception {

    List<NodeManifest> nodeManifests = new ArrayList<>();
    nodeManifests.add(new NodeManifest("localhost", Arrays.asList(new String[]{"addition"})));
    nodeManifests.add(new NodeManifest("localhost", Arrays.asList(new String[]{"subtraction","multiplication"})));
    nodeManifests.add(new NodeManifest("localhost", Arrays.asList(new String[]{"addition","multiplication","division"})));
    nodeManifests.add(new NodeManifest("localhost", Arrays.asList(new String[]{"addition","division"})));

    List<ThriftServer> arithmeticServers = new ArrayList<>();

    for (NodeManifest nodeManifest : nodeManifests) {
        ThriftServer arithmeticServer = new ThriftServer(ArithmeticServiceHandler.class);
        arithmeticServers.add(arithmeticServer);
        negotiatePort(nodeManifest,arithmeticServer);
    }


    private void negotiatePort() {
        while(true) {
        int proposedPort = arithmeticServer.start();
        int returnedPort = managementClient.registerNode(nodeManifest, proposedPort);
        if(proposedPOrt != returnedPort) {
            arithnemticServer.stop();
        }
        else
            break;
    }
}

我需要编写一个测试,我不必将negotiatePort方法直接放在测试代码中,但是我为每个节点调用了我在arithmeticNode类中的private negotiatePort方法;我不确定是否可以这样做以及如何做到这一点。我希望我比以前版本的帖子更容易混淆: - )

1 个答案:

答案 0 :(得分:1)

您可以将negotiatePort方法包设为本地。然后你就可以在你的测试中调用它(它应该存在于同一个包中)。包装外的任何人都无法使用它