2013-09-27 409 views
9

Tôi muốn sử dụng Powermock với Mockito để giả lập một số cuộc gọi phương thức tĩnh. Tôi đã làm theo hướng dẫn và ví dụ từ SO cũng như các trang PowerMock Getting StartedMockStatic nhất có thể, nhưng tôi chưa hoàn thành cuộc gọi mockStatic().Thiết lập Powemockito để chế nhạo tĩnh

Khi tôi gọi mockStatic (foo.class) từ lớp thử nghiệm của tôi, tôi trao excception:

java.lang.NoClassDefFoundError: org/Mockito/mock/MockName 
at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) 
at ...my test class method call... 

tôi chắc chắn rằng đây là một vấn đề thiết lập, như tôi đã tìm kiếm các thuật ngữ sử dụng để thiết lập điều này trở nên khá khó hiểu. Tôi đã lấy Mockito Zip từ PowerMock downloads. Trong Eclipse (3.5.2), tôi đã mở các thuộc tính của dự án và thêm tất cả các Chum vào đường dẫn xây dựng. Tôi cũng đã cố gắng thêm toàn bộ thư mục powermockito đã giải nén vào classpath vars môi trường của tôi, và sau đó chỉ là jar powermockito cụ thể khi điều đó không làm việc.

Tôi có những annotationsat lớp cấp của lớp thử nghiệm của tôi là tốt, theo các hướng dẫn powermock:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ApplicationContextLoader.class) 

Ngoài những powermock cụ thể nhập khẩu:

import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

Để những người bạn của những người đã sử dụng PowerMockito trước đây, thậm chí chỉ cần một con trỏ đúng hướng, hoặc một cái gì đó để kiểm tra sẽ thực sự hữu ích. Tôi đang đấu tranh để xem cách thiết lập của tôi khác với các bài đăng mà tôi đã thấy bằng cách sử dụng - từ những gì tôi có thể nói - cùng một cú pháp.

+0

Bạn đã bao giờ tìm thấy một giải pháp? – Dave

+0

Không phải là tôi nhớ, mặc dù nó đã được một vài năm. Tôi có câu trả lời từ @Walls upvoted, vì vậy mà phải có được sự giúp đỡ nhất, thiếu một giải pháp. – Ubunfu

Trả lời

3

Nếu bạn đang sử dụng đối tượng giả tĩnh, trong chú thích PrepareForTest, hãy thêm lớp đang sử dụng đối tượng tĩnh ngoài chính lớp tĩnh. Nếu lớp bạn đang kiểm tra cần sử dụng tĩnh này, hãy thêm lớp hiện tại vào chú thích. Bạn không thực sự chế nhạo lớp, nhưng nó cần phải có trong chú thích cho tĩnh để móc vào. Nghe có vẻ lạ, nhưng nó hoạt động.

Khi thêm nhiều lớp vào chú thích, bạn có thể đặt chúng bên trong {} và được phân tách bằng dấu phẩy. Ví dụ, nếu lớp tĩnh của bạn là StaticA.class và lớp bằng cách sử dụng tĩnh là CallerOfStatic.class bạn có thể sử dụng:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({StaticA.class, CallerOfStatic.class}) 
+0

Cảm ơn, tôi chỉ cố gắng mà ra, làm cho chú thích của tôi trông như thế này: '@RunWith (PowerMockRunner.class) @PrepareForTest ({ApplicationContextLoader.class, \t \t TestClass.class}) public class TestClass {mã lớp ..test ...} ' – Ubunfu

+0

@Ubunfu đã làm việc đó :) ??? – Walls

+0

Haha, dường như tôi đã quá bận rộn cố gắng để làm cho rằng có thể đọc được để nói rằng một phần. Nhưng dường như không có sự khác biệt nào. – Ubunfu

24

Có lẽ, các phiên bản của Powermock và Mockito không tương thích. Sửa lỗi đó và nó sẽ không còn là vấn đề nữa.

Mockito      PowerMock 
1.10.8+      1.6.2+ 
1.9.5-rc1 - 1.9.5   1.5.0 - 1.5.6 
1.9.0-rc1 & 1.9.0   1.4.10 - 1.4.12 
1.8.5      1.3.9 to 1.4.9 
1.8.4      1.3.7 & 1.3.8 
1.8.3      1.3.6 
1.8.1 & 1.8.2    1.3.5 
1.8       1.3 
1.7       1.2.5 

Xem: https://github.com/jayway/powermock/wiki/MockitoUsage

0

Hãy chắc chắn rằng powermockito và Mockito phiên bản sắp xếp như trong biểu đồ này - https://github.com/jayway/powermock/wiki/MockitoUsage#supported-versions,

Cách dễ dàng để tìm thấy là,

mvn dependency:tree | grep mockito 
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile 
[INFO] +- org.mockito:mockito-all:jar:1.9.5:compile 
[INFO] +- org.powermock:powermock-api-mockito:jar:1.5.6:compile 

Trong trường hợp của tôi, powermock 1.5.6 và mockito 1.9.5 được căn chỉnh nhưng phải thay đổi để sử dụng mockito 1.8.5, như someo ne khác trong sự phụ thuộc đã sử dụng mockito 1.8.5.

kết hợp một cách hoàn hảo Sau khi làm việc cho tôi,

mvn dependency:tree | grep mockito 
[INFO] | \- org.mockito:mockito-core:jar:1.8.5:compile 
[INFO] +- org.mockito:mockito-all:jar:1.8.5:compile 
[INFO] +- org.powermock:powermock-api-mockito:jar:1.4.9:compile