我实现了一个使用需要是可以互换的,因此,我用接口几种不同的算法类。现在我想测试我的课,但因为我使用的接口,我不能实例化的算法。
什么是从接口独立测试类的最佳方式?在测试中,我想假设每个接口的行为就像它应该是。
背景:
我目前工作的一个项目,我要实现使用几个密码原语(如签名,Mac电脑等)的加密建设。这个实现的目标是有使用没有具体的基元,然后实例使施工实际工作的原语一个通用的实现。
我实现了只用接口通用建设。我使用工厂来获得具体的原语,一切似乎好为止。但是,当然,我需要测试我的代码。
我研究了一下,不幸的是,我没有找到一个确切的答案,我的问题(也许,因为我使用了错误的搜索查询)。大多数时候人们想测试接口或接口的实现。但是,这并不适用于我的情况。
我读到的Mockito,但大多数的例子很简单,这里模拟的Mockito一个数据库,我不知道,如果是的Mockito仍然在我的情况,以测试的最佳方式,特别是如果我要模仿签名,我在那里用非对称密钥。如果我使用的Mockito,我想象中的代码变得混乱,因为Mockitos声明的“在线”的性质。
是的Mockito(或嘲弄一般)适用于这种测试的,或者说我要实现我的接口(基本)的实现?
例:
所以,我的“主”类有一个算法集:
AlgorithmSet algorithmSet;
这algorithmSet由AlgorithmFactories的
HashFactory HashFactory;
SignatureFactory signatureFactory;
SymmetricKeyFactory keyFactory;
在我的“主”类我把类似这样的算法的功能:
Signature signatureScheme = algorithmSet.getSignatureFactory().getSignature();
SignatureKeyPair keyPair = signatureScheme.generateKey();
SignatureOutput signature = signatureScheme.sign(keyPair.getPrivateKey(), message);
这只是一个小例子,我把共同为这个问题的缘故,所以我实际的代码看起来有点不同,但是这是它的要点。
签名,签名密钥对,签名输出的所有接口,因为我的“主”类我不在乎它们是什么,如果他们履行自己的目的。
什么是测试在我的情况下,“主”类的最佳方法是什么?是依然的Mockito的最佳方式?或者是更好地使所有接口的基本实现,以增强可读性?还有像5点的算法(每个具有输出,密钥等)。还是有另一种方式我没有设法找到了吗?
我真的很感谢每一个帮助,感谢您的阅读!
Mockito是存根你的接口一个很好的框架。
概念有不同的方法 - 通常区分为classical
和mockist
测试。 Martin Fowler的Mocks aren't Stubs文章就是一个这样的经典参考。
欢迎板载的#1!
如果我理解您的帖子正确的主要问题是要测试Main
类。假设你已经成功地测试了你的接口,工厂等具体实现的类
如果是的话,我会建议通过提取Main
实例获得到一个单独的方法重构你的Signature
类:
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.
}
}