2016-07-06 19 views
5

Làm thế nào tôi có thể giả lập một enum cho mục đích thử nghiệm bằng cách sử dụng Mockito? Với mẫu này cho enum:Giả lập một enum sử dụng Mockito trong Java

public enum TestEnum { 
YES, 
NO 
} 

và điều này đối với phương pháp sử dụng enum:

public static boolean WorkTheEnum(TestEnum theEnum) { 
switch (theEnum) { 
    case YES: 
    return true; 
    case NO: 
    return false; 
    default: 
    // throws an exception here 
} 
} 

làm thế nào tôi có thể thử các enum để đạt được chi nhánh mặc định của vòng lặp chuyển đổi? This answer nói rằng Mockito không thể giả lập enums nhưng câu trả lời cũng đã được cung cấp hơn một năm trước đây. Tôi có thể giả lập một enum trong khi đó hoặc có tôi để cho các chi nhánh ở lại chưa được kiểm tra? Không thể sử dụng các khung Mocking khác.

+0

Có nhiều cách để làm điều này: [Hacking Enums và sửa đổi "cuối cùng tĩnh" Fields] (http://www.javaspecialists.eu/archive/Issue161.html) – Jesper

+3

Enum giống như lớp tĩnh do đó bạn có thể ' t moke chúng với mokito.Trong mẫu của bạn, mặc định là không thể truy cập, vì vậy bạn không thể kiểm tra nó. –

+0

Tại sao muốn thử nghiệm một con đường không thể truy cập? – Manu

Trả lời

5

Có hai câu trả lời cho điều đó:

a) bạn có thể chuyển sang một số khung mô phỏng giống như PowerMock. Hai xu của tôi (entences) ở đó: không làm điều đó. PowerMock mở ra cánh cửa đến vùng đất đau đớn; mà bạn không muốn nhập.

b) đặt giao diện trên enums của bạn

Nghiêm túc; Tôi ngày nay nghĩ rằng chỉ có một trường hợp sử dụng tốt cho enums; và đó là sử dụng chúng như những người độc thân cung cấp một dịch vụ nhất định. Và sau đó, tôi làm điều này:

public interface FooService { void foo(); } 
class FooServiceImpl implements FooService { @Override void foo() ... 
enum FooServiceProvider implements FooService { 
    INSTANCE; 
    private final FooService impl = new FooServiceImpl(); 
    @Override foo() { impl.foo() 

Tất nhiên, điều này không thực sự hữu ích khi bạn sử dụng enums như bạn. Nhưng vấn đề là: bạn không nên sử dụng enums theo cách đó. Bởi vì sử dụng enums theo cách này dẫn đến mã bị phá hủy - mọi nơi cần một biến enum là cần cho các câu lệnh chuyển đổi như vậy; với tất cả các hậu quả tiêu cực khi bạn thêm/xóa các trường hợp enum.

Vì vậy, trong trường hợp của bạn: hãy cân nhắc chuyển sang thiết kế OO thực - nơi bạn có các lớp cơ sở trừu tượng xác định phương pháp; và sau đó bạn sử dụng các nhà máy để tạo các lớp con (có thể dựa trên các công tắc enum) cung cấp cho bạn các đối tượng đơn giản là làm điều đúng.

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