我正在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 {}
块在某个地方失效时。但是,我没有看到(代码库中有一个这样的块,但在这种情况下无法访问)。
如何解决此问题?
答案 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
的调用实际上并没有改变已经初始化的对象。
我感谢您的评论和提示让我看到了代码库的不同部分,非常感谢。