我正在尝试为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”
发生了什么事?
答案 0 :(得分:3)
我认为你不应该在这里使用assertEquals。
您正在检查两个特定位中的至少一个是否设置为可能是任何值的值,因此您可能希望将断言分开。
让我澄清一下: 你得到的数字由一堆设置的位(修饰符)组成,但你只关心两个特定的位。使用assertEquals,你基本上是说你需要两个特定的位集,而其他的是零。
你可以做的是断言getModifiers()& (MASK1 | MASK2)大于零,因为这两个位中的至少一个必须打开才能实现
话虽如此,有关这些数字的内容看起来很时髦,您确定使用的是正确的掩码值吗?
答案 1 :(得分:3)
它内部转换为ALT_MASK和CTRL_MASK常量(8 + 2)
它发生在JDK 6中的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和朋友是在Java 1.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
答案 2 :(得分:0)
为了扩展Uri的答案,你可能想说出类似
的内容assert(InputEvent.CTRL_DOWN_MAsK & event.getModifiers() != 0);
assert(InputEvent.ALT_DOWN_MAsK & event.getModifiers() != 0);
这将检查是否按下了两个修饰符,而不考虑字符串的其余部分,这似乎是其他内容。