2017-10-04 180 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。我想這是由模擬addressConverter類調用調用內部方法的函數引起的。該函數可能爲空?

+0

你在哪一行得到NPE?你能提供你的測試方法嗎?更一般的問題是:爲什麼你試圖嘲笑一個非常簡單的類? –

+0

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建[mcve]。使用「編輯」鏈接來改善你的*問題* - 不要通過評論添加更多信息。謝謝! – GhostCat

+0

當你忽略所有重要部分時,我們應該如何知道你的測試正在做什麼? – GhostCat

回答

1

您所期待的Mockito打電話給你的類的構造函數將初始化場convertToDTO:這是不是這樣,與簡單的測試在這裏展示它:

@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); 

如果您使用的getter,可能的Mockito已經做了你使用智能嘲笑了。

+0

謝謝@NoDataFound – blong824

0

我想,NPE是因爲你還沒有爲AddressConverter類創建一個模擬。你應該寫類似如下:

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

注:任何(Address.class)將匹配Address類的任何對象。如果要測試天氣情況,在調用(模擬)應用方法時正在使用地址對象,請繼續並在您的Address課程中添加hashcode()equals()實施。

+1

不可編譯,'apply()'屬於函數,而不是'AddressConverter'。 –