gpt4 book ai didi

java - 如何设置 Zk Sessions (org.zkoss.zk.ui),以便我可以对扩展 GenericForwardComposer 的 Controller 类进行单元测试

转载 作者:行者123 更新时间:2023-12-01 14:17:13 26 4
gpt4 key购买 nike

我正在尝试对现有的 ZK Controller 进行单元测试,并且我想找到一种方法来在对我的 Controller 进行单元测试时处理如下调用,

Sessions.getCurrent().setAttribute("from", from.getValue());

我很乐意替换有问题的代码,或者找到解决单元测试的方法。我的目标是通过处理 NullPointerException

实现可测试性

我的测试很简单(这是一个不错的起点......)

    @Test
public void zkControllerDoesMockingInitialisedSuccessfully() throws Exception {

T2TripBigDaoInterface tripBigDao = createMock(T2TripBigDao.class);
ZkFieldValidator fieldValidator = createMock(ZkTextFieldValidator.class);
FieldRangeValidator rangeValidator = createMock(DefaultFieldRangeValidator.class);

TripController controller = new TripController(tripBigDao, fieldValidator, rangeValidator);


replay(tripBigDao, fieldValidator, rangeValidator);

controller.onClick$getTrips(new Event("getTrips"));

verify(tripBigDao, fieldValidator, rangeValidator);

// Test purpose: Just get a unit test of the controller running to start with....
}

<小时/> Controller 摘录:

public class TripController extends GenericForwardComposer {

....

public void onClick$getTrips(Event event) throws Exception {
Sessions.getCurrent().setAttribute("from", from.getValue());
Sessions.getCurrent().setAttribute("to", to.getValue());

....
}
....

<小时/>堆栈跟踪摘录:

java.lang.NullPointerException
at com.t2.webservice.controller.alert.TripController.onClick$getTrips(TripController.java:72)
at com.t2.webservice.controller.alert.TripControllerTest.zkControllerDoesMockingInitialisedSuccessfully(TripControllerTest.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

最佳答案

这是我最不喜欢 ZK 的地方之一:它们对单例的使用以及对可测试性的影响。

我最终要做的是从我的 Controller 中删除对其单例( SessionsExecutionsSelectors )的任何引用。在正常操作中,这些单例会被使用,但在测试中它们可以被模拟出来。

如何去做取决于你,我还没有找到我喜欢的模式。
这是一个想法..

public class TripController extends GenericForwardComposer {

private final TripSessionManager tripSessionManager;

public TripController() {
// ZK calls the default constructor
this(new ZKTripSessionManager());
}

protected TripController(TripSessionManager tripSessionManager) {
this.tripSessionManager = tripSessionManager;
}

public void onClick$getTrips(Event event) throws Exception {
tripSessionManager.setTo(to.getValue());
tripSessionManager.setFrom(from.getValue());
}

}

您的TripSessionManager然后看起来像这样..

public interface TripSessionManager {

void setTo(String to);

void setFrom(String from);

}

默认的 ZK 实现依赖 Sessions单例..

public ZKTripSessionManager implements TripSessionManager {

public void setTo(String to) {
setAttribute("to", to);
}

public void setFrom(String from) {
setAttribute("from", from);
}

private void setAttribute(String name, String value) {
// only valid if called in a ZK managed thread
Sessions.getCurrent().setAttribute(name, value);
}

}

通过抽象实现,您可以使用模拟测试您的 Controller TripSessionManager ..

@Test
public void test() {
TripSessionManager mockTripSessionManager = mock(TripSessionManager);
when(mockTripSessionManager.setTo(anyString()).thenAnswer(...);
when(mockTripSessionManager.setFrom(anyString()).thenAnswer(...);
TripController controller = new TripController(mockTripSessionManager);
}

您还可以想象使用 Spring 或 Guice 等依赖注入(inject)框架来管理这些新依赖项的不同方法(例如:避免 new ZKTripSessionManager() )。

关于java - 如何设置 Zk Sessions (org.zkoss.zk.ui),以便我可以对扩展 GenericForwardComposer 的 Controller 类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18019830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com