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

问题描述 投票:0回答:2

我实现了一个使用需要是可以互换的,因此,我用接口几种不同的算法类。现在我想测试我的课,但因为我使用的接口,我不能实例化的算法。

什么是从接口独立测试类的最佳方式?在测试中,我想假设每个接口的行为就像它应该是。

背景:

我目前工作的一个项目,我要实现使用几个密码原语(如签名,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点的算法(每个具有输出,密钥等)。还是有另一种方式我没有设法找到了吗?

我真的很感谢每一个帮助,感谢您的阅读!

java testing junit cryptography mockito
2个回答
0
投票

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

概念有不同的方法 - 通常区分为classicalmockist测试。 Martin Fowler的Mocks aren't Stubs文章就是一个这样的经典参考。


0
投票

欢迎板载的#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.
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.