假设我们有一个叫做SomeClass的java类
public class SomeClass {
private boolean isMethod() {
return false;
}
public void sendRequest(String json, String text) {
int messageId;
if (isMethod()) {
messageId = getMessageId(json);
sendMessage(messageId, text);
} else {
throw new IllegalArgumentException();
}
}
private void sendMessage(int messageId, String text) {
}
private int getMessageId(String text) {
Pattern p = Pattern.compile("messageId=(\\d+)&");
Matcher m = p.matcher(text);
if (m.find()) {
return Integer.valueOf(m.group(1));
}
return 0;
}
}
不要注意方法'名字,他们都是可选的。
sendRequest(String json, String text)
方法。isMethod()
和getMessageId(json)
存根,并验证是否调用了sendMessage(messageId, text)
方法。 getMessageId(json)
返回25并且isMethod()
返回true。答案 0 :(得分:12)
这可以通过PowerMockito框架实现。
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClass.class)
public class SomeClassTest {
private SomeClass someInstance;
@Before
public void setUp() throws Exception {
someInstance = PowerMockito.spy(new SomeClass());
}
@Test
public void sendRequest() throws Exception {
String json = "JSON";
String text = "Some text";
int messageId = 1;
PowerMockito.doReturn(true).when(someInstance, "isMethod");
PowerMockito.doReturn(messageId).when(someInstance, "getMessageId", json);
someInstance.sendRequest(json, text);
PowerMockito.verifyPrivate(someInstance).invoke("isMethod");
PowerMockito.verifyPrivate(someInstance).invoke("getMessageId", json);
PowerMockito.verifyPrivate(someInstance).invoke("sendMessage", messageId, text);
}
}
答案 1 :(得分:5)
除了在this answer中所说的内容之外,我还想补充一下,测试私有方法是否被调用的愿望表明你正在测试implementation
与public contract of a class
相反。这不是一个最佳的想法,因为它会使您的重构更加困难。重构的想法是,您可以在不违反代码的情况下更改代码的内部工作方式。您的单元测试可帮助您确保在更改implementation
时,您未对contract
进行任何更改。
因此,在您的情况下,更好的选择是重构您的代码,以便您的测试调用公共方法并根据返回值验证结果
答案 2 :(得分:0)
Vanguard给出了正确答案,但是使用 Maven 的用户需要依赖
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito2 -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>