使用JMockit模拟正在测试的类的私有方法

我想模拟正在测试的类的私有方法,但是在方法被调用之后,方法应先返回false两次,然后方法才返回false。这是我尝试的代码。这是正在测试的课程

public class ClassToTest 

{

public void methodToTest()

{

Integer integerInstance = new Integer(0);

boolean returnValue= methodToMock(integerInstance);

if(returnValue)

{

System.out.println("methodToMock returned true");

}

else

{

System.out.println("methodToMock returned true");

}

System.out.println();

}

private boolean methodToMock(int value)

{

return true;

}

}

测试班

import org.junit.Test;

import static mockit.Deencapsulation.*;

import mockit.*;

public class TestAClass

{

@Tested ClassToTest classToTestInstance;

@Test

public void test1()

{

new NonStrictExpectations(classToTestInstance)

{

{

invoke(classToTestInstance, "methodToMock", anyInt);

returns(false);

times = 2;

invoke(classToTestInstance, "methodToMock", anyInt);

returns(true);

times = 1;

}

};

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

}

}

我这样做是为了获得预期的结果

    final StringBuffer count = new StringBuffer("0");

new NonStrictExpectations(classToTestInstance)

{

{

invoke(classToTestInstance, "methodToMock", anyInt);

result= new Delegate()

{

boolean methodToMock(int value)

{

count.replace(0, count.length(), Integer.valueOf(Integer.valueOf(count.toString())+1).toString());

if(Integer.valueOf(count.toString())==3)

{

return true;

}

return false;

}

};

}

};

回答:

回答:

结合使用Expectations和Deencapsulation.invoke(),可以部分模拟测试对象:

import org.junit.Test;

import static mockit.Deencapsulation.*;

import mockit.*;

public class TestAClass

{

public static class ClassToTest

{

public void methodToTest()

{

boolean returnValue = methodToMock(0);

System.out.println("methodToMock returned " + returnValue);

}

private boolean methodToMock(int value) { return true; }

}

@Tested ClassToTest classToTestInstance;

@Test

public void partiallyMockTestedClass() {

new Expectations(classToTestInstance) {{

invoke(classToTestInstance, "methodToMock", anyInt);

result = false;

times = 2;

}};

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

}

}

上面的测试打印:

methodToMock returned false

methodToMock returned false

methodToMock returned true

通常,当然,我们应该避免使用模拟private方法。就是说,我发现在实践中这样 有时

有用的,通常是在您拥有一个私有方法,该方法执行不平凡的事情并且已经通过另一项测试进行了测试时;在这种情况下,在第二个测试中模拟私有方法(针对不同的公共方法或通过同一公共方法的不同路径)可能比设置必要的输入/条件容易得多。

回答:

使用NonStrictExpectations编写测试也很容易(OP最初的尝试不起作用,因为相同的非严格期望记录了 两次

,第二次记录覆盖了第一条记录):

@Test

public void partiallyMockTestedClass() {

new NonStrictExpectations(classToTestInstance) {{

invoke(classToTestInstance, "methodToMock", anyInt);

returns(false, false, true);

}};

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

}

回答:

如果需要更大的灵活性,我们可以随时记录Delegate基于结果的结果:

@Test

public void partiallyMockTestedClass() {

new NonStrictExpectations(classToTestInstance) {{

invoke(classToTestInstance, "methodToMock", anyInt);

result = new Delegate() {

boolean delegate() {

boolean nextValue = ...choose next return value somehow...

return nextValue;

}

}

}};

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

classToTestInstance.methodToTest();

}

以上是 使用JMockit模拟正在测试的类的私有方法 的全部内容, 来源链接: utcz.com/qa/416550.html

回到顶部