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

How can I call a private method contained into a class that implements an interface, in a junit test?

编辑:如果 post 被认为太混乱,我深表歉意,我将对其进行编辑,只留下与我的问题有关的部分...

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

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 class 中的私有 negotiatePort 方法;我不确定是否可以这样做以及如何做到。我希望我比之前版本的 post 没有那么混乱 :-)

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