模拟接收列表并返回字符串的调用

时间:2016-09-09 16:55:06

标签: junit mocking

我会在接收列表并返回String的函数内部进行调用。我尝试了几个网站,但我不能理解我的案例是如何调整代码的。我有这个代码来模拟:

public class Procesa {
 public String preparaComando (List <String> comando){
        Prepara prepara = new Prepara();
        List <String> comandoCodificado = new ArrayList<String>();
        comandoCodificado = prepara.preparaTexto(comando);

        String textoRetorno = "";
        for (String cadena : comando)
            textoRetorno+= cadena + " ";

        return textoRetorno;
    }
....
}

我试过这个测试:

@RunWith(MockitoJUnitRunner.class)
public class ProcesaTest {

    @Mock
    Procesa procesa = mock(Procesa.class);
    @Mock
    Prepara preparaCom = mock(Prepara.class);
....
    @Test
    public void TestPreparaComando() {
        List lista = new ArrayList<>();
        lista.add("encenderluzcocina");

        verify(procesa).preparaComando(anyList()).contains("encender");
        assertEquals("encenderluzcocina", procesa.preparaComando(anyList()));

    }
}

如何测试此功能?

2 个答案:

答案 0 :(得分:1)

您应使用任何模拟来测试此类代码。您的方法接收字符串列表;它返回一个字符串。这应该是最重要的。

换句话说:你的方法有一定的契约:给定输入X,它应该提供输出Y.该方法如何从X到Y - 在实现细节下。并且您测试实施细节。

因此,简而言之,答案是:你退后一步,找出一整套有意义的输入值{X1,X2,...,Xn}。然后确定哪个输出值{Y1,Y2,... Yn}对应于每个输入。现在你写n个测试;每对一对,习。

[提示:它也可能是有效的&#34; Yi&#34;期望抛出某个例外;而不是返回值]

长话短片:如果你的方法有这么好的输入/输出设置;那么你应该使用断言来测试它。如果您的方法通过更改您所测试的类中的其他内容来工作;然后考虑添加允许您检查该状态的getter。

如果需要进行模拟,那么您应该使用依赖注入来提供&#34;模拟&#34;在你的课堂上考试。

最后:如果您有兴趣学习如何编写可测试代码,请观看这​​些videos

答案 1 :(得分:1)

为了补充其他答案,我们还可以编写一个所谓的白盒测试(也称为&#34;隔离单元测试&#34;),其中{{1}依赖被嘲笑。

例如,可以编写以下测试(在此使用JMockit模拟库,也可以使用其他库):

Prepara

尽管如此,黑盒测试几乎总是比白盒测试更好。