Java 老鼠怪
我正在尝试创建一个带有特定修饰符的MouseEvent,用于单元测试。我正在使用J2SE,以下代码无法通过:Java 老鼠怪,java,events,junit,Java,Events,Junit,我正在尝试创建一个带有特定修饰符的MouseEvent,用于单元测试。我正在使用J2SE,以下代码无法通过: public void testMouseEventProblem() { MouseEvent event = new MouseEvent(new JPanel(), 1, System.currentTimeMillis(), InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK, 1,1, 0, false);
public void testMouseEventProblem() {
MouseEvent event = new MouseEvent(new JPanel(), 1, System.currentTimeMillis(),
InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK, 1,1, 0, false);
assertEquals(InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK, event.getModifiers());
}
它抱怨说“预计640,但实际是10”
发生了什么事?我认为您不应该在这里使用assertEquals 您正在检查两个特定位中的至少一个是否设置在可以是任何值的值中,因此您可能希望分离断言 让我澄清一下: 您将得到一个由一组设置的位(修饰符)组成的数字,但您只关心两个特定的位。使用assertEquals,本质上就是说需要两个特定的位集,而其他位集为零 您可以做的是断言getModifiers()&(MASK1 | MASK2)大于零,因为这两个位中至少有一位必须为on才能发生
话虽如此,这些数字看起来有些古怪,您确定使用了正确的掩码值吗?我认为您不应该在这里使用assertEquals 您正在检查两个特定位中的至少一个是否设置在可以是任何值的值中,因此您可能希望分离断言 让我澄清一下: 您将得到一个由一组设置的位(修饰符)组成的数字,但您只关心两个特定的位。使用assertEquals,本质上就是说需要两个特定的位集,而其他位集为零 您可以做的是断言getModifiers()&(MASK1 | MASK2)大于零,因为这两个位中至少有一位必须为on才能发生
话虽如此,这些数字看起来有些古怪,你确定使用了正确的掩码值吗?它会在内部转换为ALT\u掩码和CTRL\u掩码常量(8+2) 它发生在JDK6中的
java.awt.event.InputEvent:405
中
/**
* Returns the modifier mask for this event.
*/
public int getModifiers() {
return modifiers & (JDK_1_3_MODIFIERS | HIGH_MODIFIERS);
}
尝试getModifiersEx():442
:
public int getModifiersEx() {
return modifiers & ~JDK_1_3_MODIFIERS;
}
因为ALT_DOWN_MASK和friends是Java1.3之后引入的扩展修饰符
证明:
public class MouseEvt {
public static void main(String[] args) {
MouseEvent event = new MouseEvent(new JPanel(), 1, System
.currentTimeMillis(), InputEvent.CTRL_DOWN_MASK
| InputEvent.ALT_DOWN_MASK, 1, 1, 0, false);
System.out.printf("%d - %d%n", InputEvent.CTRL_DOWN_MASK
| InputEvent.ALT_DOWN_MASK,
event.getModifiersEx());
}
}
返回
640-640
它在内部转换为ALT_掩码和CTRL_掩码常量(8+2)
它发生在JDK6中的java.awt.event.InputEvent:405
中
/**
* Returns the modifier mask for this event.
*/
public int getModifiers() {
return modifiers & (JDK_1_3_MODIFIERS | HIGH_MODIFIERS);
}
尝试getModifiersEx():442
:
public int getModifiersEx() {
return modifiers & ~JDK_1_3_MODIFIERS;
}
因为ALT_DOWN_MASK和friends是Java1.3之后引入的扩展修饰符
证明:
public class MouseEvt {
public static void main(String[] args) {
MouseEvent event = new MouseEvent(new JPanel(), 1, System
.currentTimeMillis(), InputEvent.CTRL_DOWN_MASK
| InputEvent.ALT_DOWN_MASK, 1, 1, 0, false);
System.out.printf("%d - %d%n", InputEvent.CTRL_DOWN_MASK
| InputEvent.ALT_DOWN_MASK,
event.getModifiersEx());
}
}
返回
640-640
要扩展Uri的答案,您可能想说
assert(InputEvent.CTRL_DOWN_MAsK & event.getModifiers() != 0);
assert(InputEvent.ALT_DOWN_MAsK & event.getModifiers() != 0);
这将检查两个修饰符是否都被按下,而不考虑字符串的其余部分,这似乎是其他内容。要扩展Uri的答案,您可能需要说
assert(InputEvent.CTRL_DOWN_MAsK & event.getModifiers() != 0);
assert(InputEvent.ALT_DOWN_MAsK & event.getModifiers() != 0);
这将检查两个修饰符是否都被按下,而不考虑字符串的其余部分,这似乎是另一回事。但是如果知道为什么getModifiers()返回不同的数量(我不是Java爱好者,只是好奇),那还是很好的。但是你是对的,OP应该能够测试特定的位。要检查设置的位,可以执行以下操作:assertEquals(InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK,(InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK)&event.getModifiers();但是知道为什么getModifiers()返回一个不同的数量还是很好的(我不是Java爱好者,只是好奇而已)。但是你是对的,OP应该能够测试特定的位。要检查位是否被设置为on,你可以这样做:assertEquals(InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK,(InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK)&event.getModifiers();