2011-07-01 21 views
13

Tôi gặp sự cố với EasyMock 2.5.2 và JUnit 4.8.2 (chạy qua Eclipse). Tôi đã đọc tất cả các bài viết tương tự ở đây nhưng chưa tìm thấy câu trả lời. Tôi có một lớp học có chứa hai bài kiểm tra mà kiểm tra cùng một phương pháp. Tôi đang sử dụng matchers.EasyMock: java.lang.IllegalStateException: 1 đối sánh dự kiến, 2 được ghi lại

  1. Mỗi bài kiểm tra trôi qua khi chạy một mình.
  2. Bài kiểm tra đầu tiên luôn trôi qua - điều này đúng nếu tôi chuyển đổi thứ tự các bài kiểm tra trong tệp.

Đây là một phiên bản đơn giản của mã kiểm tra:

private Xthing mockXthing; 
private MainThing mainThing; 

@Before 
public void setUp() { 
    mockXthing = EasyMock.createMock(Xthing.class); 
    mainThing = new MainThing(); 
    mainThing.setxThing(mockXthing); 
} 

@After 
public void cleanUp() { 
    EasyMock.reset(mockXthing); 
} 

@Test 
public void testTwo() { 
    String abc = "abc"; 
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc); 
    EasyMock.replay(mockXthing); 
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject()); 
    assertEquals("abc", testResult); 
    EasyMock.verify(mockXthing); 
} 

@Test 
public void testOne() { 
    String xyz = "xyz"; 
    EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz); 
    EasyMock.replay(mockXthing); 
    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject()); 
    assertEquals("xyz", testResult); 
    EasyMock.verify(mockXthing); 
} 

Các thử nghiệm thứ hai (hoặc cuối) luôn thất bại với các lỗi sau:

java.lang.IllegalStateException: 1 matchers expected, 2 recorded 

Bất kỳ cái nhìn sâu sắc này sẽ là đánh giá cao.

Cảm ơn, Anne

+0

Dòng nào ném ngoại lệ đó? –

+0

Xin lỗi - trong bài kiểm tra thứ hai (hoặc cuối cùng) - EasyMock.expect (mockXthing.doXthing ((String) EasyMock.anyObject())).andReturn (xyz); – Anne

+0

OK vâng tôi nghĩ đó là câu trả lời của tôi. –

Trả lời

9

Tôi đã không nhìn tỉ mỉ chặt chẽ, nhưng điều này có vẻ nghi ngờ:

String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject()); 

anyObject() là một khớp và bạn đang gọi nó sau replay. Nó không được sử dụng để tạo ra bất kỳ đối tượng nào. Nó được sử dụng để chỉ dẫn EasyMock cho phép bất kỳ đối tượng nào. EasyMock đang phát hiện ra rằng đối sánh bổ sung nhưng nó không có hại cho đến khi thử nghiệm thứ hai. Tại thời điểm đó, số lượng đối sánh mà EasyMock đã ghi lại nhưng chưa được sử dụng (2) không khớp với số lượng tham số được mong đợi cho cuộc gọi thứ hai doXthing (1).

Bạn phải chuyển các thông số thực tới testCallingXthing (hoặc mô hình ở chế độ phát lại). Hãy thử chuyển trực tiếp trong số null trực tiếp hoặc giá trị thực như 2.

+0

Bạn chính xác! Tôi không cần phải sử dụng matchers trong dòng bạn đăng. Tôi chỉ có thể vượt qua các đối tượng thực hoặc thậm chí null (mã kiểm tra thực có 4 tham số). Cảm ơn bạn rất nhiều. – Anne

2

Hãy thử:

String testResult = mainThing.testCallingXthing(eq(EasyMock.anyLong())); 

Có quẹt tinh tế hơn so với anyObject(). Điều này cho phép bạn thực hiện xác nhận dựa trên loại về cộng tác viên.

Từ EasyMock documentation:

eq(X value)
Matches if the actual value is equals the expected value. Available for all primitive types and for objects.
anyBoolean() , anyByte() , anyChar() , anyDouble() , anyFloat() , anyInt() , anyLong() , anyObject() , anyShort()

3

cho tôi thất bại này (. Trong trường hợp 2 quẹt tôi mong đợi, 4 ghi) có nghĩa là "bạn đang trộn EasyMock và Mockito trong các thử nghiệm đơn vị tương tự, vì vậy vô tình gọi Phương thức notNull() của easymock cho một đối số mockito gây ra lỗi nhưng chỉ khi các phép thử được chạy theo một thứ tự nhất định

+0

Tôi tin rằng đây cũng là trường hợp của tôi. Tôi đã thử câu trả lời của Mark và nó không hoạt động. Kiểm tra vẫn không liên tục. Tôi sẽ viết lại các bài kiểm tra hoàn toàn trong Mockito. – xli

+0

Đối với tôi, tôi đã sử dụng một que diêm Easymock thay vì một macther Hamcrest trong một khẳng định. Mặc dù tôi đã thiết lập lại và phát lại theo thứ tự đúng, nó đã ghi lại chúng và làm cho thử nghiệm tiếp theo thất bại. Điều này đã giúp tôi tìm thấy nó. – twinj

0

Bạn nên đặt lại mô hình sau mỗi phương pháp thử để loại bỏ vấn đề này. vấn đề này.

@After 
public void after(){ 
    EasyMock.reset(mockXthing) 
} 
Các vấn đề liên quan