Junit 模拟接收列表并返回字符串的呼叫

Junit 模拟接收列表并返回字符串的呼叫,junit,mocking,Junit,Mocking,我将在一个函数中对一个调用进行模拟,该函数接收一个列表并返回一个字符串。我尝试了几个网站,但我不明白如何适应我的情况下的代码。我有以下代码要模仿: public class Procesa { public String preparaComando (List <String> comando){ Prepara prepara = new Prepara(); List <String> comandoCodificado = new

我将在一个函数中对一个调用进行模拟,该函数接收一个列表并返回一个字符串。我尝试了几个网站,但我不明白如何适应我的情况下的代码。我有以下代码要模仿:

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;
    }
....
}
公共类程序{
公共字符串preparaComando(列表comando){
Prepara Prepara=新的Prepara();
List comandocodevicado=new ArrayList();
comandocodevicado=prepara.preparaTexto(comando);
字符串textoreno=“”;
为(弦乐卡德纳:科曼多)
textoreno+=cadena+“”;
返回textoreno;
}
....
}
我试着做这个测试:

@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()));

    }
}
@RunWith(MockitoJUnitRunner.class)
公共类过程测试{
@嘲弄
Procesa Procesa=mock(Procesa.class);
@嘲弄
Prepara preparaCom=mock(Prepara.class);
....
@试验
公共无效TestPreparaComando(){
List lista=new ArrayList();
增加(“encenderluzcocina”);
验证(procesa).preparaComando(anyList()).contains(“encender”);
资产质量(“encenderluzcocina”,procesa.preparaComando(anyList());
}
}

如何测试此函数?

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

换句话说:您的方法有一个特定的契约:给定输入X,它应该传递输出Y。该方法是如何从X到Y的-这在实现细节下进行的。您不需要测试实现细节

简言之,答案是:退一步,计算出完整的有意义的输入值{X1,X2,…,Xn}。然后确定每个输入对应的输出值{Y1,Y2,…Yn}。现在编写n个测试;每对一对席,Yi。 [提示:期望抛出某个异常也可能是有效的“Yi”;而不是返回值]

长话短说:如果你的方法有这么好的输入/输出设置;然后您应该只使用断言测试它。如果你的方法是通过改变被测班级中的其他事物来实现的;然后考虑添加允许检查状态的吸气剂。 如果需要模拟,那么您应该使用依赖项注入,以便在测试的类中提供“模拟”内容


最后:如果您对学习如何编写可测试代码感兴趣,请观看以下内容

为了补充另一个答案,我们还可以编写一个所谓的白盒测试(也称为“独立单元测试”),其中对
Prepara
依赖项进行模拟

例如,可以编写以下测试(在这里使用JMockit mocking库,也可以使用其他测试):

公共类过程测试
{
@经测试的Procesa Procesa;
@嘲笑Prepara preparaCom;
@试验
公共行政命令{
最终名单comando=asList(“a”、“b”、“c”);
新期望(){{
preparaCom.preparaTexto(comando);返回(“encender”、“luzcocina”);
}};
字符串结果=procesa.preparaComando(comando);
assertEquals(“encender luzcocina”,结果);
}
}

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

附带说明:英语是本网站的主要语言。所以,不是张贴代码是意大利语?西班牙语。。。最好准备一个简单的例子,用英语术语说明你的问题。这只会增加你得到有用答案的机会。只是想知道:在问题一个月后不再接受另一个答案,而不接受另一个答案有什么意义?您在这里收到任何其他新答案的机会非常接近0。非常感谢!!!我解决了我的问题,也学到了更多关于测试过程的知识。你给了我一个很好的回复,谢谢!!非常欢迎你;总是乐于助人;这样好的反馈是一个漫长的一周很好的完成!这个答案是假设黑盒测试是可行的。好吧,如果真是这样的话,那么我完全同意应该这样写,没有任何嘲弄。但是,如果结果是
Prepara
依赖项妨碍了(例如,它可能调用远程web服务),那么在模拟此依赖项的情况下编写白盒测试也同样有效。
public class ProcesaTest
{
    @Tested Procesa procesa;
    @Mocked Prepara preparaCom;

    @Test
    public void preparaComando() {
        final List<String> comando = asList("a", "b", "c");

        new Expectations() {{
            preparaCom.preparaTexto(comando); returns("encender", "luzcocina");
        }};

        String result = procesa.preparaComando(comando);

        assertEquals("encender luzcocina", result);
    }
}