2015-02-11 18 views
8

Tôi có một phương pháp trong lớp AppleProcessor mà tôi muốn thử nghiệm:Mockito ClassCastException - Một mô hình không thể được đúc

public void process(Fruit fruit) { 
    if(fruit.getType() == Fruit.APPLE) { 
     fruitBasket.add(((AppleFruit) fruit).getApple()); 
    } 
    else { 
     // do something else 
    } 
} 

Lưu ý rằng trái cây là một giao diện với phương pháp getType() mà AppleFruit thực hiện và cũng có một getApple().

thử nghiệm của tôi trông giống như:

@Mock 
FruitBasket fruitBasket; 

@Mock 
Fruit fruit; 

@Mock 
AppleFruit apple; 

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

@Test 
public void testAnAppleIsProcessed() { 
    AppleProcessor appleProcessor = new AppleProcessoer(); 
    when(fruit.getType()).thenReturn(Fruit.APPLE); 
    when(((AppleFruit) fruit).getApple()).thenReturn(apple); 

    appleProcessor.process(fruit); 

    verify(fruitBasket).add(isA(Apple.class)); 
} 

Tuy nhiên tôi nhận được lỗi sau:

java.lang.ClassCastException: package.fruit.Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54 cannot be cast to package.fruit.AppleFruit

mà xuất phát từ dòng này trong các thử nghiệm

when(((AppleFruit) fruit).getApple()).thenReturn(apple);

Would bất cứ ai k bây giờ làm thế nào để giải quyết điều này vì vậy tôi có thể kiểm tra mã của tôi?

Trả lời

22

Khi bạn nói

@Mock 
Fruit fruit; 

Bạn nói Mockito: biến fruit phải là một thể hiện của Fruit. Mockito sẽ tự động tạo một lớp thực hiện Fruit (lớp này là Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54) và tạo một thể hiện của lớp này. Không có lý do gì cho lớp này là một thể hiện của AppleFruit, vì bạn không nói với Mockito rằng đối tượng phải thuộc loại AppleFruit.

Tuyên bố nó là AppleFruit và sẽ là loại AppleFruit.

+0

Cảm ơn, thử nghiệm hoạt động ngay bây giờ. – user2844485

0

Đối tượng giả của bạn được tăng cường bởi Mockito và nó không giống với lớp của bạn, vì vậy bạn không thể nhập diễn viên.

+0

Vì vậy, không có cách nào xung quanh nó mà không không sử dụng đối tượng giả? – user2844485

+2

Có chắc chắn. Tôi sẽ đề nghị gọi phương pháp với cá thể táo, không phải trái cây. –

Các vấn đề liên quan