如何使用void编写JUnit 3 Test

时间:2014-08-15 22:13:00

标签: java junit

public Slave(Player player) {
    this.party = new Party(0, null, null, null, this);
    Networker.getInstance().sendString("--commandtype=system--message=setupclient--name=" + player.getPlayerName());
    synchronized (this) {
        this.status = State.WAITING;
    }
}

我需要用JUnit 3编写一个测试,但我不知道如何在上面的代码中编写一个。 因为这个方法将String发送到某个地方。我总是得到一个nullpointer异常。我能做什么?我正在寻求最大代码覆盖率

2 个答案:

答案 0 :(得分:3)

此类取决于Networker实例。您的目标是在测试中替换此依赖项。有几种方法可以做到这一点:

  1. 使用service locator
  2. 用户IoC
  3. 模拟Networker.getInstance()
  4. 服务定位器

    在这种情况下,Slave不应该知道从哪里获取Networker的实例。它应该从服务的中央注册表获得实例。这意味着您需要ServiceLocator类,它基本上会存储Networker实例的链接,您可以在测试中替换它。

    IoC模式

    这有点类似于服务定位器,因为Slave不知道从哪里获取Networker的实例。在这种情况下,应该通过这样的构造函数在外部提供这种依赖(也就是注入):

    public Slave(Player player, Networker networker) {
        // same as above but networker passed to method is used
    }
    

    在这种情况下,您可以使用专门为您的测试设计的另一个网络实例(或模拟或存根)。

    直接模拟静态调用

    一些模拟框架allow mocking静态方法。您可以模拟对Networking.getInstance()的调用,以便您可以使用正确的参数检查调用是否发生。 但这是not recommended,我不鼓励您使用此方法。另请参阅thisthis

答案 1 :(得分:0)

代码Networker.getInstance()看起来像是在使用单例模式。您可能正在获取空指针异常,因为Networker单例尚未初始化。因此Networker.getInstance()返回null,您对sendString的调用失败。

如果没有看到更多的代码,很难准确说出来,但似乎Networker类中会有另一个静态方法允许你初始化单例。您可以尝试从测试用例中调用它。

但是,请注意,这样做不会导致您的测试通过网络发送真实消息!

根据我使用单例模式的经验,在编写测试时经常会导致这些问题。出于这个原因,我通常会尽量避免使用单例模式。

您可以考虑尝试使用refactor代码来改进其设计,并允许您将test double替换为Networker。考虑尝试用dependency injection替换单例的使用。