如何为声明
编写junit
if (!messageMap.isEmpty())
其中messageMap
是TreeMap
。
我写了如下,
PowerMockito.when(!messageMap.isEmpty()).thenReturn(true);
但是这段代码无效。
答案 0 :(得分:1)
目前尚不清楚你要求的是什么。
如果您只是想确保生产调用使调用isEmpty()
,那么理想的测试方法就是传递空和非-empty映射到您测试的代码。
含义;你做了类似的事情:
@Test
public void testWithEmptyMap() {
UnderTest underTest = new UnderTest(Collections.emptyMap());
assertThat(underTest.foo(), is(whatever));
@Test
public void testWithFilledMap() {
UnderTest underTest = new UnderTest(Collections.singletonMap(key, value));
assertThat(underTest.foo(), is(somethingElse));
换句话说:最佳测试方式无需嘲笑。你给代码测试不同的输入;并且断言您获得了不同输入值的预期结果。
但是,当然,有时您必须控制如何将模拟对象传递给您测试的代码;在这种情况下,是的,您实际上可以创建一个messageMap mock并将其配置为:
Mockito.when(messageMap.isEmpty()).thenReturn(false);
但是:那将是不好的做法。您只能模拟无法轻松控制的对象。地图非常容易控制;只需将一些内容推入其中(或将其留空)。因此,不是传递一个配置为空或包含值的模拟地图...传递一个真实的地图;要么为空,要么包含一些值!
答案 1 :(得分:0)
通常你不应该模拟任何util类(List,Map或Set)。你可以通过以下两种方法编写测试用例
方法1:如果你想让messageMap.isEmpty()返回true,那么创建空树对象,如下所示。
Map<K, V> messageMap = new TreeMap<>();
方法2:如果你想让messageMap.isEmpty()返回false,那么按下面的方式创建树对象。
Map<K, V> messageMap = new TreeMap<>();
messageMap.put(k1,v1);
messageMap.put(k2,v2);
并且只是将messageMap对象传递给实际的类方法,它应该可以正常工作。
希望这很有用。
答案 2 :(得分:0)
你是在试图嘲笑电话还是做出断言?
如果是模拟,你可以写:
Mockito.when(messageMap.isEmpty()).thenReturn(false);
如果有断言:
Assert.assertTrue(messageMap.isEmpty());