构造函数产生null - 从哪里开始?

时间:2017-04-25 12:45:27

标签: java unit-testing constructor testng

我正在eclipse中为现有代码创建一组TestNG测试,这些代码据称可以根据CRL验证证书。

在我的测试中,我创建了一个新类来提供验证功能,如下所示:

public void testRevokedCertificate() throws Exception {
    EmbeddedFileServer embeddedFileServer = new EmbeddedFileServer(CertificateResourceHelper.getResourcePath("."));
    embeddedFileServer.start();
    URL crlUrl = new URL("http://localhost:" + embeddedFileServer.getPort() + "/certs/" + "test_ca1.crl");
    CachingValidCrlProvider prov = new CachingValidCrlProvider(crlUrl, publicKey, 1, 2);
    assertNotNull(prov);
}

构造函数CachingValidCrlProvider(URL, publicKey, int, int) 总是返回null!这对我来说是一个谜,因为构造函数看起来不是很特别:

public CachingValidCrlProvider(URL crlUrl, PublicKey expectedPublicKey, int failedDownloadBackoffTimeInSeconds, int forcedCrlRefreshIntervalInSeconds) {
    System.out.println("Creating CachingValidCrlProvider (this is never displayed)");
    this.crlUrl = crlUrl;
    this.expectedPublicKey = expectedPublicKey;
    crlDownloadState = new CrlDownloadState(failedDownloadBackoffTimeInSeconds, forcedCrlRefreshIntervalInSeconds);
}

第一次调试println() 以某种方式永远不会达到,因为我在stdout中找不到打印的行。 AFAIK是构造函数可能产生null的几种方法之一,当static {}块在某个地方失效时。但是,我没有看到(代码库中有一个这样的块,但在这种情况下无法访问)。

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

静态初始化块在其他任何东西之前执行,所以代码到达了,你只是不知道它。我建议你在静态块中添加一个断点,并使用调试器(包含在eclipse或Intellij中)来查看它何时失败。祝你好运。

答案 1 :(得分:1)

引自Jon Skeet的StackOverflow答案:

  

来自15.9.4 of the JLS部分:

     
    

类实例创建表达式的值是对指定类的新创建对象的引用。每次计算表达式时,都会创建一个新对象。

  
     

所以不,它永远不会返回null。

Java中的构造函数 CAN NOT 返回null。对象可以为null的唯一情况是,如果您没有调用构造函数,或者构造函数引发了异常。

修改

至于你的代码,IMO最可能的可能性是代码不会停留在你的assertNotNull(prov)上,但永远不会到达它,而是在之前的某个地方崩溃。您应该尝试使用调试器/更多sysout。

答案 2 :(得分:0)

谢谢大家的回复。他们帮助我找到了根本原因。事实证明,在另一个测试中有一个 mock 初始化此类(此代码库中有其他人约300个现有测试)。

因为代码广泛使用单例,所以我对new的调用实际上并没有改变已经初始化的对象。

我感谢您的评论和提示让我看到了代码库的不同部分,非常感谢。