为什么模拟方法总是正确的?
Why mock method is allways correct?
我在 spock 框架中编写了一些单元测试。但是我的测试总是正确的,即使我传递了错误的值。
class CalculatorTest extends Specification {
def "Method should return roman number"() {
given:
CalculatorApi romanCalculator = Mock()
when: "I add two numbers as integer"
romanCalculator.add(2, 2)
then: "Method should return roman number as String"
romanCalculator.add(2, 2) >> 32131
}
方法"add"应该return字符串。在这个测试中,一个方法应该 return Integer.
public class RomanCalculator implements CalculatorApi {
private RomanConverter romanConverter;
public RomanCalculator() {
this.romanConverter = new RomanConverter();
}
public String add(int one, int two) throws OperationFail {
int number = one + two;
try {
return romanConverter.convertNumber(number);
} catch (NumberNotFound e) {
throw new OperationFail(e.getMessage());
}
}
public class RomanConverter implements ConverterApi {
public String convertNumber(Integer number) throws NumberNotFound {
switch(number) {
case 1:
return "I";
case 2:
return "II";
case 3:
return "III";
case 4:
return "IV";
case 5:
return "V";
case 6:
return "VI";
case 7:
return "VII";
case 8:
return "VIII";
case 9:
return "IX";
case 10:
return "X";
default:
throw new NumberNotFound();
}
}
为什么这个方法不起作用?我刚开始用 mock 学习单元测试。
问题是:为什么要模拟? Mock 用于确保没有其他依赖项,以便测试特定方法。可以模拟所有外部依赖项以避免出现问题(例如数据库连接:您想要测试使用从数据库检索的数据的逻辑,因此您想要模拟正在执行数据库请求的对象)。
另外,请添加您使用的 Mock 库的详细信息。
这里你是说如果你用参数 (2,2) 调用你的方法,它将 return 执行罗马计算器 (2,2),这是错误的。你不是在这里测试,Mock不是用来测试你想测试的class,而是用来简化其他对象并在安全可控的环境中测试你的方法。
示例:
Instance retrieve = new Instance()
method doSomething() {
retrievedVal = retrieve.retrieveFromDB(something)
return transform(retrievedVal)
}
你的测试应该是:
test() {
Instance retrieve = mock()
when retrieve(specific something).thenReturn(specificRetrievedVal)
test doSomething()
}
我避免了一个完整而完整的例子,这样你就可以理解你到底需要做什么并尝试:)
我在 spock 框架中编写了一些单元测试。但是我的测试总是正确的,即使我传递了错误的值。
class CalculatorTest extends Specification {
def "Method should return roman number"() {
given:
CalculatorApi romanCalculator = Mock()
when: "I add two numbers as integer"
romanCalculator.add(2, 2)
then: "Method should return roman number as String"
romanCalculator.add(2, 2) >> 32131
}
方法"add"应该return字符串。在这个测试中,一个方法应该 return Integer.
public class RomanCalculator implements CalculatorApi {
private RomanConverter romanConverter;
public RomanCalculator() {
this.romanConverter = new RomanConverter();
}
public String add(int one, int two) throws OperationFail {
int number = one + two;
try {
return romanConverter.convertNumber(number);
} catch (NumberNotFound e) {
throw new OperationFail(e.getMessage());
}
}
public class RomanConverter implements ConverterApi {
public String convertNumber(Integer number) throws NumberNotFound {
switch(number) {
case 1:
return "I";
case 2:
return "II";
case 3:
return "III";
case 4:
return "IV";
case 5:
return "V";
case 6:
return "VI";
case 7:
return "VII";
case 8:
return "VIII";
case 9:
return "IX";
case 10:
return "X";
default:
throw new NumberNotFound();
}
}
为什么这个方法不起作用?我刚开始用 mock 学习单元测试。
问题是:为什么要模拟? Mock 用于确保没有其他依赖项,以便测试特定方法。可以模拟所有外部依赖项以避免出现问题(例如数据库连接:您想要测试使用从数据库检索的数据的逻辑,因此您想要模拟正在执行数据库请求的对象)。 另外,请添加您使用的 Mock 库的详细信息。
这里你是说如果你用参数 (2,2) 调用你的方法,它将 return 执行罗马计算器 (2,2),这是错误的。你不是在这里测试,Mock不是用来测试你想测试的class,而是用来简化其他对象并在安全可控的环境中测试你的方法。 示例:
Instance retrieve = new Instance()
method doSomething() {
retrievedVal = retrieve.retrieveFromDB(something)
return transform(retrievedVal)
}
你的测试应该是:
test() {
Instance retrieve = mock()
when retrieve(specific something).thenReturn(specificRetrievedVal)
test doSomething()
}
我避免了一个完整而完整的例子,这样你就可以理解你到底需要做什么并尝试:)