如何彻底测试使用接口的类



我实现了一个使用几种需要互换的不同算法的类,因此,我使用接口。现在我想测试我的类,但由于我使用了接口,所以我无法实例化算法。

独立于接口测试类的最佳方法是什么?在测试中,我想假设每个接口的行为都像它应该的那样。

背景:

我目前正在进行一个项目,我必须实现一个使用多个加密原语(如签名、Mac 等)的加密结构。 此实现的目标是拥有一个不使用特定基元的泛型实现,然后实例化基元,以便构造实际工作。

我仅使用接口实现了通用构造。我使用工厂来获取特定的原语,到目前为止一切似乎都很好。但是,当然,我需要测试我的代码。

我研究了一下,不幸的是,我没有找到我问题的确切答案(也许,因为我使用了错误的搜索查询)。 大多数时候,人们想要测试接口或接口的实现。但这不适用于我的情况。

我读过关于Mockito的文章,但大多数例子都很简单,其中Mockito模拟了一个数据库,我不知道Mockito是否仍然是在我的情况下测试的最佳方式,特别是如果我想模拟签名,我使用非对称密钥。如果我使用 Mockito,我想代码会变得混乱,因为 Mockitos 声明的"内联"性质。

Mockito(或一般的模拟)是否适用于此类测试,或者我是否必须实现接口的(基本)实现?

例:

所以我的"主"类有一个算法集:

AlgorithmSet algorithmSet;

此算法集由算法工厂组成

HashFactory HashFactory;
SignatureFactory signatureFactory;
SymmetricKeyFactory keyFactory;

在我的"main"类中,我调用算法的函数类似于以下内容:

Signature signatureScheme = algorithmSet.getSignatureFactory().getSignature();
SignatureKeyPair keyPair = signatureScheme.generateKey();
SignatureOutput signature = signatureScheme.sign(keyPair.getPrivateKey(), message);

这只是我为了这个问题而整理的一个小例子,所以我的实际代码看起来有点不同,但这就是它的要点。

签名,签名密钥对,签名输出都是接口,因为在我的"主"类中,我不关心它们是否满足了它们的目的。

在我的情况下,测试"主"类的最佳方法是什么?莫基托仍然是最好的方式吗?还是对所有接口进行基本实现以增强可读性更好?有大约 5 种算法(每种算法都有输出、键等)。还是还有另一种我还没有找到的方法?

我非常感谢每一个帮助和感谢阅读!

Mockito是一个很好的框架来存根你的接口。

从概念上讲,有不同的方法 - 通常区分为classicalmockist测试。Martin Fowler Mocks are not Stubs 文章是这方面的经典参考。

欢迎加入 Stackoverflow!

如果我正确理解了您的帖子,则主要问题即将测试Main类。假设您已经成功测试了接口、工厂等的具体实现类。

如果是这样,我建议通过将实例的获取提取到单独的方法来重构MainSignature

class Main {
...
Signature getSignature() {
algorithmSet.getSignatureFactory().getSignature();
}
Signature signatureScheme = getSignature();
...
}

现在,在单元测试中,您可以用模拟实例替换真实的Signature实例。Mockito非常适合这种方式。

class MainTest {
@Test
public void testSomething() {
Signature mockedSignature = Mockito.mock(Signature.class);
// TODO: define the behavior of the mocked Signature.
// Given an instance of Main class but with overridden method to get mocked Signature. 
Main customMain = new Main() {
@Override
Signature getSignature() {
return mockedSignature;
}
}
// When
customMain.doSomething()
// Then
// TODO: validate the actual result and mocks interactions.
}
}

相关内容

  • 没有找到相关文章

最新更新