我对单元测试和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");
}
}
欢迎所有建议或帮助, 谢谢!
答案 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
时),您必须使用类似的代码。