2017-10-04 6 views
-1

とMockitoモックJavaの機能私はそうのようなクラスを持っている:内部方式

@Component 
    public class AddressConverter { 

     public Function<Address, AddressDTO> convertToDTO = new Function<Address, AddressDTO>() { 
      public AddressDTO apply(Address address) { 
       AddressDTO dto = new AddressDTO(); 
       dto.setAddress1(address.getAddress1()); 
       dto.setAddress2(address.getAddress2()); 
       dto.setCity(address.getCity()); 
       dto.setState(address.getState()); 
       dto.setZip(address.getZip()); 
       dto.setZip4(address.getZip4()); 
       return dto; 
      } 
     }; 
} 

私はそうのように、これを使用して別のクラスがあります。

 @Component 
      public class ProfileConverter { 

       @Autowired 
       private AddressConverter addressConverter; 

       public Function<Profile, ProfileDTO> convertToDTO = new Function<Profile, ProfileDTO>() { 
        public ProfileDTO apply(Profile profile) { 
         ProfileDTO dto = new ProfileDTO(); 
     dto.setEmployeeAddress(addressConverter.convertToDTO.apply(profile.getEmployeeAddress())); 
return dto; 
        } 
       }; 
    } 

を私のようなaddressConverterクラスをモックしようとしています:

EDIT: HERE IS THE TEST CLASS 

public class ProfileConverterTest { 

    ProfileConverter converter; 
    AddressConverter addressConverter; 
    Profile profile; 
    ProfileDTO dto; 
    Address address; 
    AddressDTO addressDTO; 

    @Before 
    public void setUp() { 
     converter = new ProfileConverter(); 
     addressConverter = Mockito.mock(AddressConverter.class); 
     profile = new Profile(); 
     profile.setProfileId(123L); 
     dto = new ProfileDTO(); 
     Mockito.when(addressConverter.convertFromDTO.apply(addressDTO)).thenReturn(address); 
     Mockito.when(addressConverter.convertToDTO.apply(address)).thenReturn(addressDTO); 
     ReflectionTestUtils.setField(converter, "addressConverter", addressConverter); 
     address = new Address("1","2","3","4","5","6"); 
     address.setAddressId(123L); 
     addressDTO = new AddressDTO("hash","1","2","3","4","5","6"); 
    } 

    @Test 
    public void applyReturnsProfileDTO() throws Exception { 
     ProfileDTO result = converter.convertToDTO.apply(profile); 
assertEquals(result.getEmployeeAddress().getAddress1(), profile.getEmployeeAddress().getAddress1()); 
} 
} 

最初のMockito.when行でテストでNullPointerExceptionが発生し続けます。私は、内部メソッドを呼び出す関数を呼び出すmock addressConverterクラスによって引き起こされたと考えています。関数がnullの可能性がありますか?

+0

NPEはどの回線にありますか?テスト方法をそのまま提供できますか?より一般的な質問は、なぜあなたは非常にシンプルなクラスを模擬しようとするのですか? –

+0

デバッグヘルプ(「なぜこのコードは動作しませんか?)」には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法。あなたの*質問*を改善するために "編集"リンクを使用してください - コメントでより多くの情報を追加しないでください。ありがとう! – GhostCat

+0

テストの重要な部分をすべて省略したときに、テストが行​​っていることをどのように知っていますか? – GhostCat

答えて

1

:このケースではありません、ここで簡単なテストがそれを示しています

@Test 
    public void test_that_yeepee_works() { 
    final Yeepee y = Mockito.mock(Yeepee.class);  
    Assertions.assertNotNull(y.myObject); // fails. 
    } 

    public static class Yeepee { 
    public Object myObject = new Object(); 
    } 

あなたが代わりにMockito.spyを試してみてください。

それとも、明示的にそれを実行する必要があります。あなたはゲッターを使用していた場合

converter = new ProfileConverter(); 
addressConverter = Mockito.mock(AddressConverter.class); 
addressConverter.convertToDTO = (Function<Address, AddressDTO>) Mockito.mock(Function.class); 

、Mockitoは、あなたがスマートモックを使用するためにそれを行っている可能性があります。

+0

ありがとうございます@NoDataFound – blong824

0

私はAddressConverterクラスのモックを作成していないため、NPEと思われます。あなたは以下のようなものを書く必要があります。

AddressConverter addressConverter = Mockito.mock(AddressConverter.class); 
Mockito.when(addressConverter.apply(any(Address.class))).thenReturn(addressDTO); 

注:任意の(Address.class)はAddressクラスの任意のオブジェクトに一致します。あなたの住所オブジェクトが呼び出されている間にあなたの住所オブジェクトが使用されている場合は、Addressクラスにhashcode()equals()の実装を追加してください。あなたはMockitoは、フィールドconvertToDTOが初期化されますされ、あなたのクラスのコンストラクタを呼び出すために期待している

+1

コンパイルできません。 'apply()'はFunctionに属し、AddressConverterには属しません。 –

関連する問題