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);
}
}