Come invocare funzioni anonime nei test?

4

Di seguito è riportato il codice Java.

Ho bisogno di coprire la funzione qui sotto. Ho cercato molti siti Web, ma non ho ancora idee. Esistono metodi per coprire le classi anonime di override?

  public static void addEnterListener(Text text, final String methodName, final Object callee) {
    text.addKeyListener(new KeyListener() {
    @Override
    public void keyReleased(KeyEvent arg0) {
    if (arg0.keyCode == '\r') {
      try {
        Method method = callee.getClass().getMethod(methodName, KeyEvent.class);
        method.invoke(callee, arg0);
      } catch (Exception e) {e.printStackTrace();}
    }
  }

  @Override
  public void keyPressed(KeyEvent arg0) { 
  }
});
}
    
posta wonderland 27.02.2013 - 09:31
fonte

3 risposte

6

No, non c'è modo di farlo con le classi anonime.

Puoi rifattorizzare il tuo codice così:

  public static void addEnterListener(Text text, final String methodName, final Object callee) {
    text.addKeyListener(new MyKeyListener());
  }

  class MyKeyListener implements KeyListener {
    @Override
    public void keyReleased(KeyEvent arg0) {
      if (arg0.keyCode == '\r') {
        try {
          Method method = callee.getClass().getMethod(methodName, KeyEvent.class);
          method.invoke(callee, arg0);
        } catch (Exception e) {e.printStackTrace();}
      }
    }

    @Override
    public void keyPressed(KeyEvent arg0) { 
    }
  }
    
risposta data 27.02.2013 - 09:49
fonte
3

Bene, per quel codice, è possibile iniettare un oggetto di testo simulato e recuperare il keyListener dopo il ritorno e chiamare keyReleased su questo, ad es. usando mockito

@Test
void doTest(){
  Text mock = mock(Text.class);
  StaticClass.addEnterListener(mock, ....);
  ArgumentCaptor<KeyListener> captor = ArgumentCaptor.forClass(KeyListener.class);
  verify(mock).addKeyListener(captor.capture());
  KeyListener theListener = captor.getValue();

  theListener.keyReleased(...);
}

Non ho provato questo, ma questo dovrebbe essere il modo ... anche se vorrei incoraggiare a refactoring questo ...

    
risposta data 27.02.2013 - 11:28
fonte
0

Come terza opzione, la creazione di un refactor di KeyListener in un metodo getKeyListener. Chiama quel metodo dal tuo codice di test per ottenere un KeyListener da testare. Chiamalo anche in addEnterListener per aggiungere KeyListener da aggiungere.

    
risposta data 28.02.2013 - 16:41
fonte

Leggi altre domande sui tag