MouseEvent奇怪

时间:2009-07-17 20:54:54

标签: java events junit

我正在尝试为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”

发生了什么事?

3 个答案:

答案 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);

这将检查是否按下了两个修饰符,而不考虑字符串的其余部分,这似乎是其他内容。