【发布时间】:2016-04-14 05:36:45
【问题描述】:
Alpha - 以 beta 作为子代的父代
public class Alpha {
Beta beta;
public Alpha(int argument) {}
void start() {
beta = createBeta();
}
Beta createBeta() {
return new Beta(this);
}
}
Beta - alpha 的孩子,拥有 charlie
public class Beta {
Alpha alpha;
Charlie charlie;
public Beta(Alpha alpha) {
this.alpha = alpha;
this.charlie = createCharlie();
}
Charlie createCharlie() {
return new Charlie().shuffle();
}
}
Charlie - 有一个列表,通常在生产中被打乱
public class Charlie {
List<Integer> list = new ArrayList<Integer>();
public Charlie() {
for (int i = 0; i < 6; i++) {
list.add(i);
}
}
public Charlie shuffle() {
Collections.shuffle(list);
return this;
}
@Override
public String toString() {
return list.toString();
}
}
AlphaTest [需要有关此测试的帮助] - 想尝试不同的改组变体,看看 alpha/beta 会如何反应。
public class AlphaTest {
Charlie special = new Charlie();
@Test
public void testSpecialCharlie() {
Alpha alpha = Mockito.spy(new Alpha(0));
Beta beta = Mockito.spy(alpha.createBeta());
Mockito.when(alpha.createBeta()).thenReturn(beta);
Mockito.when(beta.createCharlie()).thenReturn(special);
alpha.start();
// FAILURE: expected:<[0, 1, 2, 3, 4, 5]> but was:<[0, 4, 1, 5, 3, 2]>
assertEquals(special.list, alpha.beta.charlie.list);
}
}
目标是用查理的不同组合测试 Alpha/Beta。不确定最好的方法是什么?这是复制的确切代码。也可以更改设置以方便测试。尝试了不同的变化,没有任何真正的工作。非常感谢您的帮助。
我不确定,我尝试了很多方法(模拟 createCharlie() 函数,模拟 Charlie 类,模拟 shuffle(),将 createCharlie() 移动到父 Alpha 类,没有什么能正常工作或者我可能遗漏了什么。任何帮助将不胜感激。谢谢!
想知道为什么我不能这样做:
Charlie charlie = Mockito.mock(Charlie.class);
Mockito.when(charlie.shuffle()).thenReturn(special);
【问题讨论】:
-
“没有什么能真正正常工作”是什么意思?
-
对不起,我的意思是,我无法让它工作,我对测试真的很陌生,所以我可能做得不对。我也可以稍微调整一下设置。请让我知道你将如何做到这一点?谢谢!
-
这样的单元测试代码使用 JMockit 非常容易(您只需声明一个
@Mocked Beta或@Mocked Charlie字段/参数,然后记录/验证任何调用,无论实例如何在 CUT 中创建)... 但是,我首先会问为什么要模拟这里的任何东西?请记住,嘲笑是不能被滥用的。像 Kent Beck(TDD 的创建者)、Martin Fowler 和其他“大师”这样的人不喜欢嘲笑(有充分的理由)。 -
我实际上不知道去这里的最佳方式是什么。我没有设置 JMockit。认为这应该是直截了当的,测试经验有限,但已经浪费了几天,仍然无法弄清楚:(
标签: java unit-testing testing mocking mockito