2017-10-04 178 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'。 –