execChangedMasterValue 的 Eclipse Scout Neon 单元测试
Eclipse Scout Neon unit test of execChangedMasterValue
我有两个字段是主从关系:
public class Slave extends AbstractListBox<String> {
@Override
protected Class<? extends IValueField> getConfiguredMasterField() {
return Master.class;
}
@Override
protected void execChangedMasterValue(final Object newMasterValue) {
this.function() // -> here I put debugging break point
}
}
public class Master extends AbstractBooleanField {
@Override
protected void execChangedValue() {
super.execChangedValue(); // -> Break point 2
}
}
我为这个关系写了单元测试,但是单元测试内部 execChangedMasterValue
从来没有被调用过。
我的单元测试看起来像:
@Test
public void test() {
this.box.getMaster.setValue(true)
Assert.assertFalse(... something from function Slave ...)
}
单元测试总是失败,如果我如上所述放置断点,调试器只会在第二个断点处停止,而不会在第一个断点处停止。
在 "real" 世界中,函数被调用,一切正常。
没有调用execChangedMasterValue
有什么原因吗? execChangedMasterValue
的行为与 changedValue()
不同吗?
我无法重现您所描述的内容。我使用了 Scout HelloWorld 项目(创建新项目时生成的项目)。
在 HelloWorldForm
中,我在 MainBox
中添加了这个 "slave" 字段:
@Order(2000)
public class LengthField extends AbstractIntegerField {
@Override
protected String getConfiguredLabel() {
return TEXTS.get("Length");
}
@Override
protected Class<? extends IValueField<?>> getConfiguredMasterField() {
return MessageField.class;
}
@Override
protected void execChangedMasterValue(Object newMasterValue) {
if(newMasterValue instanceof String) {
String s = (String) newMasterValue;
setValue(s.length());
} else {
setValue(0);
}
}
}
并且在示例单元测试 HelloWorldFormTest
中,我向 testMessageCorrectlyImported()
添加了额外的检查:
/**
* Tests that the {@link MessageField} is correctly filled after start.
*/
@Test
public void testMessageCorrectlyImported() {
HelloWorldForm frm = new HelloWorldForm();
frm.start();
Assert.assertEquals("Message field", MESSAGE_VALUE, frm.getMessageField().getValue());
Assert.assertEquals("Length field", Integer.valueOf(MESSAGE_VALUE.length()) , frm.getLengthField().getValue());
frm.getMessageField().setValue("abcdef");
Assert.assertEquals("Length field (after update)", Integer.valueOf("abcdef".length()), frm.getLengthField().getValue());
}
一切都按预期进行……
我有两个字段是主从关系:
public class Slave extends AbstractListBox<String> {
@Override
protected Class<? extends IValueField> getConfiguredMasterField() {
return Master.class;
}
@Override
protected void execChangedMasterValue(final Object newMasterValue) {
this.function() // -> here I put debugging break point
}
}
public class Master extends AbstractBooleanField {
@Override
protected void execChangedValue() {
super.execChangedValue(); // -> Break point 2
}
}
我为这个关系写了单元测试,但是单元测试内部 execChangedMasterValue
从来没有被调用过。
我的单元测试看起来像:
@Test
public void test() {
this.box.getMaster.setValue(true)
Assert.assertFalse(... something from function Slave ...)
}
单元测试总是失败,如果我如上所述放置断点,调试器只会在第二个断点处停止,而不会在第一个断点处停止。
在 "real" 世界中,函数被调用,一切正常。
没有调用execChangedMasterValue
有什么原因吗? execChangedMasterValue
的行为与 changedValue()
不同吗?
我无法重现您所描述的内容。我使用了 Scout HelloWorld 项目(创建新项目时生成的项目)。
在 HelloWorldForm
中,我在 MainBox
中添加了这个 "slave" 字段:
@Order(2000)
public class LengthField extends AbstractIntegerField {
@Override
protected String getConfiguredLabel() {
return TEXTS.get("Length");
}
@Override
protected Class<? extends IValueField<?>> getConfiguredMasterField() {
return MessageField.class;
}
@Override
protected void execChangedMasterValue(Object newMasterValue) {
if(newMasterValue instanceof String) {
String s = (String) newMasterValue;
setValue(s.length());
} else {
setValue(0);
}
}
}
并且在示例单元测试 HelloWorldFormTest
中,我向 testMessageCorrectlyImported()
添加了额外的检查:
/**
* Tests that the {@link MessageField} is correctly filled after start.
*/
@Test
public void testMessageCorrectlyImported() {
HelloWorldForm frm = new HelloWorldForm();
frm.start();
Assert.assertEquals("Message field", MESSAGE_VALUE, frm.getMessageField().getValue());
Assert.assertEquals("Length field", Integer.valueOf(MESSAGE_VALUE.length()) , frm.getLengthField().getValue());
frm.getMessageField().setValue("abcdef");
Assert.assertEquals("Length field (after update)", Integer.valueOf("abcdef".length()), frm.getLengthField().getValue());
}
一切都按预期进行……