JMockit 期望 API - return 输入参数
JMockit expectations API - return input parameters
我知道如果我想模拟一个方法并根据其输入为其分配特定行为,我可以使用 MockUps API:
public class DuplicationTest {
static class Duplicator {
public String duplicate(String str) { return null; }
}
@Test
public void verifySameStringReturnedWithMockupsAPI() throws Exception {
new MockUp<Duplicator>() {
@Mock public String duplicate(String str) { return str; }
};
Duplicator dup = new Duplicator();
assertEquals("test", dup.duplicate("test"));
}
}
此测试通过。
但是,有时我没有使用 MockUps API 的奢侈(例如,当模拟静态 类 时),因此我只能使用 Expectations API:
@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
new Expectations() {{
dup.duplicate(anyString); result = anyString;
}};
assertEquals("test", dup.duplicate("test"));
}
这显然失败了。调用 dup.duplicate("test")
returns 一个空的 String
(可能是某种默认值)。有什么解决办法吗?
在您的第二个示例中,它 return 是一个空字符串,因为您正在设置 result = anyString
。 anyString 是一个 jmockit 对象,用于匹配任何可能的字符串值。您要做的是将结果设置为您实际想要的值 return,在本例中为 result = "test"
.
受 Rogério 的评论启发,我设法使用 Delegate
:
解决了这个问题
@SuppressWarnings("unused")
@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
new Expectations() {{
dup.duplicate(anyString);
result = new Delegate<String>() { String delegate(String str) { return str; }};
}};
assertEquals("test", dup.duplicate("test"));
assertEquals("delegate did it", dup.duplicate("delegate did it"));
}
这不是最优雅的解决方案,如果 Delegate
class 是 @FunctionalInterface
(我知道这将在 JMockit 的下一个主要版本中发生).
目前,这似乎是根据 Expectations API.
中的输入参数模拟行为的唯一方法
我知道如果我想模拟一个方法并根据其输入为其分配特定行为,我可以使用 MockUps API:
public class DuplicationTest {
static class Duplicator {
public String duplicate(String str) { return null; }
}
@Test
public void verifySameStringReturnedWithMockupsAPI() throws Exception {
new MockUp<Duplicator>() {
@Mock public String duplicate(String str) { return str; }
};
Duplicator dup = new Duplicator();
assertEquals("test", dup.duplicate("test"));
}
}
此测试通过。
但是,有时我没有使用 MockUps API 的奢侈(例如,当模拟静态 类 时),因此我只能使用 Expectations API:
@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
new Expectations() {{
dup.duplicate(anyString); result = anyString;
}};
assertEquals("test", dup.duplicate("test"));
}
这显然失败了。调用 dup.duplicate("test")
returns 一个空的 String
(可能是某种默认值)。有什么解决办法吗?
在您的第二个示例中,它 return 是一个空字符串,因为您正在设置 result = anyString
。 anyString 是一个 jmockit 对象,用于匹配任何可能的字符串值。您要做的是将结果设置为您实际想要的值 return,在本例中为 result = "test"
.
受 Rogério 的评论启发,我设法使用 Delegate
:
@SuppressWarnings("unused")
@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
new Expectations() {{
dup.duplicate(anyString);
result = new Delegate<String>() { String delegate(String str) { return str; }};
}};
assertEquals("test", dup.duplicate("test"));
assertEquals("delegate did it", dup.duplicate("delegate did it"));
}
这不是最优雅的解决方案,如果 Delegate
class 是 @FunctionalInterface
(我知道这将在 JMockit 的下一个主要版本中发生).
目前,这似乎是根据 Expectations API.