2013-07-30 67 views
5

Tôi đang cố gắng xác minh rằng phương thức Collections.shuffle() đã được gọi trong một trong các lớp của tôi. Tôi đọc qua tài liệu (ít) về PowerMock với Mockito và đọc qua các câu hỏi SO khác giải quyết vấn đề này và không nhận được giải pháp.Giả lập tĩnh với PowerMock và Mockito không hoạt động

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 
     PowerMockito.doCallRealMethod().when(Collections.class); 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 

public class ClassToTest { 
    private final List<Something> list; 
    // ... 
    public void doSomething() { 
     Collections.shuffle(list); 
     // do more stuff 
    } 
} 

Với mã trên, tôi mong đợi đơn vị kiểm tra vượt qua. Tuy nhiên, kiểm tra đơn vị không thành công như sau:

Wanted but not invoked java.util.Collections.shuffle([]); 
Actually, there were zero interactions with this mock. 

Tôi đang làm gì sai?

Cảm ơn

EDIT: Theo gợi ý dưới đây tôi đã cố gắng điều sau đây, và tôi nhận được lỗi tương tự.

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 
+0

Điều gì sẽ xảy ra nếu bạn nới lỏng hạn chế trên đối sánh từ 'anyListOf' thành' any (List.class) '? Điều gì sẽ xảy ra nếu bạn thêm 'ClassToTest' vào chú thích' @ PrepareForTest'? –

Trả lời

4

Bạn có thể giả/xác minh phương pháp java.util.Collections.shuffle ([]) hoặc gọi việc thực hiện thực (với PowerMockito.doCallRealMethod()). Nhưng bạn không thể làm cả hai.

Nếu bạn loại bỏ

PowerMockito.doCallRealMethod().when(Collections.class); 

cuộc gọi sẽ được xác minh và kiểm tra sẽ vượt qua.

https://powermock.googlecode.com/svn/docs/powermock-1.4.7/apidocs/org/powermock/api/mockito/PowerMockito.html#doCallRealMethod%28%29

Mã này làm việc cho tôi:

package test; 

import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 
/*  PowerMockito.doCallRealMethod().when(Collections.class); remove this line */ 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 

class ClassToTest { 
    private List<Something> list = new LinkedList<Something>(); 
    // ... 
    public void doSomething() { 
     Collections.shuffle(list); 
     // do more stuff 
    } 
} 
class Something { 
} 
+0

Tôi đã thử những gì bạn đề xuất và thử nghiệm của tôi vẫn không thành công khi nói rằng không có tương tác nào với mô hình. Xem chỉnh sửa của tôi. –

+0

Ah cảm ơn bạn ... Tôi đã bỏ lỡ phần mà tôi phải gọi Collections.shuffle() ... Mặc dù tôi có thể thề rằng tôi đã thử điều đó. –

4

Đây là một câu hỏi khá cũ, nhưng tôi vẫn muốn làm rõ rằng câu trả lời được chấp nhận là trong thực tế không chính xác. Bằng cách thực hiện đoạn mã sau,

PowerMockito.mockStatic(Collections.class); 
Collections.shuffle(Mockito.anyListOf(Something.class)); 

tất cả thẩm tra sẽ luôn luôn vượt qua sau:

PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
Collections.shuffle(Mockito.anyListOf(Something.class)); 

ngay cả khi bạn không gọi test.doSomething(); các thử nghiệm được cung cấp trong câu trả lời vẫn sẽ vượt qua. Cách chính xác để kiểm tra điều này là thực sự kiểm tra xem các mục trong Danh sách đã được sắp xếp đúng chưa.