JMockit - 意外调用
JMockit - Unexpected invocation
我有一个使用 JMockit 进行单元测试的简单实现。具体实现如下
Team
class
public class Team {
private TeamLeader teamLeader;
public Team(TeamLeader teamleader) {
this.teamLeader = teamleader;
}
public boolean hasDiscussion() {
System.out.println("Discussion is hold by " + teamLeader.getName());
Discussion discussion = new Discussion();
return discussion.start();
}
}
TeamLeader
class
public class TeamLeader {
private String name;
public TeamLeader(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Discussion
class
public class Discussion {
public boolean start() {
return false;
}
}
然后,我有一个单元测试来测试功能hasDiscussion
,如下
@RunWith(JMockit.class)
public class TeamTest {
private Team team;
@Test
public void hasDiscussion(@Mocked TeamLeader teamLeader, @Mocked Discussion discussion) {
new Expectations() {{
teamLeader.getName(); result = "teamleader";
discussion.start(); result = true;
}};
team = new Team(teamLeader);
boolean actualResult = team.hasDiscussion();
new Verifications() {{
assertThat(actualResult, is(true));
}};
}
}
执行测试时,出现如下错误
Unexpected invocation of:
entity.Discussion#Discussion()
on instance: entity.Discussion@7b70deb2
when was expecting an invocation of:
entity.Discussion#start()
on mock instance: entity.Discussion@6f93ad02
mockit.internal.UnexpectedInvocation: Unexpected invocation of:
entity.Discussion#Discussion()
on instance: entity.Discussion@7b70deb2
when was expecting an invocation of:
对这类问题有什么想法吗?
发生这种情况是因为您的 hasDiscussion
方法正在创建 Discussion
class 的新实例,在这种情况下,您不能模拟它。
要解决这个问题,您可以接收 Discuss
class 作为方法的参数并发送模拟,我们在 Team
class 构造函数中注入讨论 class。
我有一个使用 JMockit 进行单元测试的简单实现。具体实现如下
Team
class
public class Team {
private TeamLeader teamLeader;
public Team(TeamLeader teamleader) {
this.teamLeader = teamleader;
}
public boolean hasDiscussion() {
System.out.println("Discussion is hold by " + teamLeader.getName());
Discussion discussion = new Discussion();
return discussion.start();
}
}
TeamLeader
class
public class TeamLeader {
private String name;
public TeamLeader(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Discussion
class
public class Discussion {
public boolean start() {
return false;
}
}
然后,我有一个单元测试来测试功能hasDiscussion
,如下
@RunWith(JMockit.class)
public class TeamTest {
private Team team;
@Test
public void hasDiscussion(@Mocked TeamLeader teamLeader, @Mocked Discussion discussion) {
new Expectations() {{
teamLeader.getName(); result = "teamleader";
discussion.start(); result = true;
}};
team = new Team(teamLeader);
boolean actualResult = team.hasDiscussion();
new Verifications() {{
assertThat(actualResult, is(true));
}};
}
}
执行测试时,出现如下错误
Unexpected invocation of:
entity.Discussion#Discussion()
on instance: entity.Discussion@7b70deb2
when was expecting an invocation of:
entity.Discussion#start()
on mock instance: entity.Discussion@6f93ad02
mockit.internal.UnexpectedInvocation: Unexpected invocation of:
entity.Discussion#Discussion()
on instance: entity.Discussion@7b70deb2
when was expecting an invocation of:
对这类问题有什么想法吗?
发生这种情况是因为您的 hasDiscussion
方法正在创建 Discussion
class 的新实例,在这种情况下,您不能模拟它。
要解决这个问题,您可以接收 Discuss
class 作为方法的参数并发送模拟,我们在 Team
class 构造函数中注入讨论 class。