Как сопоставить аргумент поставщика, возвращающий разные типы в одном и том же методе во время насмешки - PullRequest
0 голосов
/ 01 апреля 2019

Идея кода, который я пишу,

public Class MyClass() {

    private PrimaryClass  primaryClass; 
    private CustomClass1  customeClass1;
    private CustomClass2  customeClass2;

    public void execute() {

         Type1 obj1 = primaryClass.doSomething(() -> customeClass1.doSomethingElse1())

         Type2 obj2 = primaryClass.doSomething(() -> customeClass2.doSomethingsElse2())

}

Я пытаюсь написать модульные тесты для этого, но я не могу смоделировать эти два разных вызова, возвращая разные вызовы, идентифицируя разные типы аргументов. Как вы можете видеть в приведенном выше коде, я передаю поставщиков в качестве аргумента, и каждый из них возвращает различный тип, основываясь на том, что я понял из этого поста , я пытался сделать это,

  @Mock private PrimaryClass  primaryClass; 
  @Mock private CustomClass1  customeClass1;
  @Mock private CustomClass2  customeClass2;

  @InjectMock private MyClass myClass;

  @Test
  public test() {

       when(primaryClass.doSomething(ArgumentMatchers.<Supplier<Type1>>any())).thenReturn(ObjectofType1);
       when(primaryClass.doSomething(ArgumentMatchers.<Supplier<Type2>>any())).thenReturn(ObjectofType2);

       myClass.execute(); 
   }

То, что происходит выше, таково: второй сопоставитель совпадает с ними обоими, и я получаю ошибку, так как Type2 не может быть приведен как объект Type1.

Я также пытался реализовать что-то вроде того, что не сработало

  @Mock private primaryClass  primaryClass; 
  @Mock private CustomClass1  customeClass1;
  @Mock private CustomClass2  customeClass2;

  @InjectMock private MyClass myClass;

  @Test
  public test() {

       when(primaryClass.doSomething(ArgumentMatchers.argThat(new Typ1Matcher)).thenReturn(ObjectofType1);
       when(primaryClass.doSomething(ArgumentMatchers.argThat(new Type2Matcher)).thenReturn(ObjectofType2);

       myClass.execute(); 
   }

   private class Type1Matcher implements ArgumentMatcher<Supplier<Type1>> {

      public matcher(Supplier<Type1> supplier) {
           if(supplier != null) {
              return supplier.get() instanceOf Type1 
            } 
         return false;
      }
  }

  private class Type2Matcher implements ArgumentMatcher<Supplier<Type2>> {

      public matcher(Supplier<Type2> supplier) {
         if(supplier != null) {
              return supplier.get() instanceOf Type2 
            } 
         return false;
      }
  }

Я не понимаю, как ArgumentMatcher соответствует аргументам, когда дело доходит до поставщиков. Если кто-то понимает, если я делаю что-то не так для использования, пожалуйста, помогите мне.

...