我正在尝试为UnitTesting创建一个带有某些修饰符的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);
assertEquals(InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK, event.getModifiers());
}它抱怨地说“预期是640,但实际上是10”
到底怎么回事?
发布于 2009-07-17 20:59:05
它在内部转换为ALT_MASK和CTRL_MASK常量(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
发布于 2009-07-17 20:57:21
我不认为你应该在这里使用assertEquals。
您正在检查一个值中是否至少设置了两个特定位中的一个,该值可以是任何值,因此您可能希望分隔断言。
让我澄清一下这一点:您得到的是一个由一堆设置的位(修饰符)组成的数字,但您只关心两个特定的位。使用assertEquals,您实际上是在说您想要两个特定的位集,而其他位集是零。
您可以做的就是断言getModifiers() &( MASK1 | MASK2 )大于零,因为这两位中至少有一位必须为on才能实现
这就是说,这些数字看起来有些古怪,你确定你使用的掩码值是正确的吗?
发布于 2009-07-17 21:01:39
要扩展Uri的答案,您可能想要这样说
assert(InputEvent.CTRL_DOWN_MAsK & event.getModifiers() != 0);
assert(InputEvent.ALT_DOWN_MAsK & event.getModifiers() != 0);这将检查两个修饰符是否都被按下,而不考虑字符串的其余部分,这似乎是另一回事。
https://stackoverflow.com/questions/1145643
复制相似问题