用java中的模拟编写单元测试

时间:2015-04-27 07:14:53

标签: java unit-testing

我对单元测试和Mocks的一切都有点新意,所以我想我可以使用一些帮助。

我需要为这段代码编写单元测试:

@Service
public class TwitterService {

    @Autowired(required=false)
    private Twitter twitter;

    private static final int RESULTSIZE = 5;


    public List<TwitterDTO> getTweets(String tag)
    {
        String searchTag = "#" + tag;
        SearchParameters param = new SearchParameters(searchTag);
        param.count(RESULTSIZE);
        param.resultType(ResultType.RECENT);

        List<TwitterDTO> tweetList= new ArrayList<TwitterDTO>();


        SearchResults results = twitter.searchOperations().search(param);

        for(Tweet tweet: results.getTweets()) {
            TwitterDTO twitterDTO = new TwitterDTO();
            twitterDTO.setTweetId(tweet.getId());
            twitterDTO.setName(tweet.getUser().getName());
            twitterDTO.setUserNameTwitter(tweet.getFromUser());
            twitterDTO.setCreatedDate(tweet.getCreatedAt());
            twitterDTO.setMessage(tweet.getUnmodifiedText());
            twitterDTO.setRetweetCount(tweet.getRetweetCount());
            twitterDTO.setFavoriteCount(tweet.getFavoriteCount());
            twitterDTO.setProfileImageUrl(tweet.getProfileImageUrl());
            twitterDTO.setTwitterUrl("https://twitter.com/" + tweet.getFromUser() + "/status/" + tweet.getId());
            tweetList.add(twitterDTO);
        }

        return tweetList;
    }

    public boolean isAvailable()
    {
        return this.twitter != null;
    }

到目前为止,就我的测试知识而言,我有这个:

@RunWith(MockitoJUnitRunner.class)
public class TestTwitterLogic {


    @Mock
    private Twitter twitter;

    @InjectMocks
    private TwitterService service;

    @Before
    public void setup()
    {
        MockitoAnnotations.initMocks(this);
    }


    @Test
    public void testService()
    {
        assertTrue(service.isAvailable());
        service.getTweets("test");
    }

}

欢迎所有建议或帮助, 谢谢!

1 个答案:

答案 0 :(得分:2)

你需要模仿twitter.searchOperations().search(param)。模拟框架不支持模拟整个方法调用链;这就是为什么你需要模仿链条的每个部分:

SearchOperations searchOpMock = mock( SearchOperations.class );
when( twitter.searchOperations() ).thenReturn( searchOpMock );

嘲笑第一部分。您现在可以定义一个或多个搜索结果并模拟searchOpMock.search()

when( searchOpMock.search( any( SearchParameters.class ) ) ).thenReturn( results );

any( SearchParameters.class )表示&#34;我不在乎搜索是否使用了正确的参数&#34;。当类没有实现正确的equals()方法时(例如,当它从equals()继承Object时),您必须使用类似的代码。