【发布时间】:2014-06-19 14:37:51
【问题描述】:
我的Java 代码结构如下:
public MyClass {
// some class variables
...
private void process() {
private MyObject obj;
...
obj = createHelper();
...
messageHelper(obj, "One of several possible strings");
...
messageHelper(obj, "Another call with a different string");
...
}
private MyObject createHelper {
MyObject obj = new MyObject();
// some Setter calls
...
return obj;
}
private void messageHelper (MyOject obj, String message) {
...
}
}
我想测试,基于属性obj(我想指定),messageHelper() 接收正确的字符串。换句话说,我需要控制一种方法的结果并访问另一种方法的参数。
我仍然对所有这些 Mock/Stub/Spy 的东西感到非常不安。
在我看来,我需要在 MyClass、stub CreateHelper() 上使用“手动”创建的对象来 Spy,并且不确定要拦截 messageHelper() 的调用参数的内容。
我还注意到Wiki 警告不要使用间谍:
在使用此功能之前请三思。改变可能会更好 规范下的代码设计。
那么,完成这项任务的合适 Spocky 方式是什么?
稍微重构的代码: (5/5/14)
public MyClass {
// some class variables
private messageSevice = new messageService();
...
private void process() {
private MyObject obj;
...
obj = new MyObject(parameters ...);
...
if (someCondition) {
messageService.produceMessageOne(obj);
}
...
if (otherCondition) {
messageService.produceMessageTwo(obj);
{
...
}
}
public class MessageService implements IMessageService {
private final static MSG_ONE = "...";
private final static MSG_TWO = "...";
...
public void produceMessageOne(MyObject obj) {
produceMessage(obj, MSG_ONE);
...
}
public void produceMessageOne(MyObject obj) {
produceMessage(obj, MSG_TWO);
}
private void produceMessage(MyObject obj, String message) {
...
}
}
如果有人建议应该使用 Spock 进行测试的方式,我将不胜感激。
【问题讨论】:
标签: java unit-testing groovy spock