2010-05-24 36 views
8

Tôi muốn chạy thử nghiệm đơn vị trong đó hằng số hơi khác so với phiên bản chuẩn. Đó là, trong module mặc định của tôi, sau đây làPhân cấp các mô-đun trong guice

bindConstant().annotatedWith(Names.named("number of players")).to(4); 

nhưng trong thử nghiệm, tôi muốn thử dòng này thay vì:

bindConstant().annotatedWith(Names.named("number of players")).to(2); 
Id

muốn đạt được điều đó mà không cần sao chép tất cả các phần còn lại của mô-đun. Những gì tôi thực sự muốn là một mô-đun "mặc định" là "bên dưới" một mô-đun chuyên biệt hơn, như vậy trong trường hợp xung đột, mô-đun chuyên biệt thắng (thay vì ném một ngoại lệ, đó là những gì guice hiện).

Về bản chất, câu hỏi của tôi là: làm thế nào để mọi người sắp xếp cho nhiều hơn một mô-đun mà không cần nhiều bản sao mã?

Cập nhật: Tôi đã nhận ra rằng giải pháp thực sự là sử dụng nhà máy chứ không phải là hằng số trong trường hợp sử dụng này. Tôi vẫn muốn được quan tâm để tìm hiểu nếu có cái gì đó giống như hệ thống phân cấp của mô-đun nói chung, mặc dù.

Trả lời

10

Thông thường khi sử dụng Guice đúng cách, bạn không cần sử dụng Guice trong tất cả các thử nghiệm (đặc biệt là kiểm thử đơn vị ... tích hợp và kiểm tra đầu cuối, vâng). Dù sao:

Tôi không chắc mình hiểu bạn đang cố làm gì hay vấn đề gì chính xác nhưng ... bạn nhận ra rằng khi tạo Injector bạn có thể cung cấp số lượng Module s cho nó, đúng không? Đó là một phần quan trọng trong việc sử dụng Guice. Làm cho các mô-đun như khóa học hoặc hạt mịn như bạn muốn. Bạn có thể có một NumberOfPlayersModule mà chỉ có một ràng buộc, và sau đó sử dụng một mô-đun khác nhau với một ràng buộc khác nhau thay vì đôi khi (như cho thử nghiệm của bạn). Bạn cũng có thể tạo mô-đun nhận đối số hàm tạo và tạo mô-đun là new NumberOfPlayersModule(4) hoặc new NumberOfPlayersModule(2) tùy thích.

Ngoài ra còn có một tính năng khác của Guice cho phép bạn ghi đè liên kết trong một hoặc nhiều mô-đun với các ràng buộc từ một hoặc nhiều mô-đun khác. Điều đó hoạt động như thế này:

// FooModule is your module that contains the "number of players" binding and 
// some others 

Module override = Modules.override(new FooModule()) 
    .with(new AbstractModule() { 
     protected void configure() { 
     bindConstant().annotatedWith(Names.named("number of players")).to(2); 
     } 
    }); 
Injector injector = Guice.createInjector(override); 
// The int @Named("number of players") for the injector is 2 

Như bạn thấy, có rất nhiều cách để cấu hình ứng dụng của bạn theo những cách khác nhau dễ dàng.

+0

Ghi đè! Đó là chính xác những gì tôi muốn! Cảm ơn bạn! – nes1983

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