2009-03-11 21 views
17

Để chạy các thử nghiệm đơn vị của tôi trên Eclipse của tôi, tôi cần thiết lập một số thuộc tính cho máy ảo. Vì vậy, khi tôi chạy thử nghiệm JUnit lần đầu tiên, tôi vào "Open Run Dialog", sau đó trong cấu hình JUnit cho bài kiểm tra này, tôi vào tab "Arguments" và đặt mọi thứ tôi cần vào "đối số VM" vùng văn bản.Tự động thêm các thuộc tính khi chạy JUnit trong Eclipse

Có cách nào để tự động thêm một tập hợp các thuộc tính khi chạy JUnit, vì vậy tôi chỉ có thể nhấp chuột phải vào lớp kiểm tra và nhấp vào "Chạy dưới dạng> Kiểm tra Junit" để chạy thử nghiệm ?

Thông tin kỹ thuật: Eclipse 3.3.2, JUnit 4, Java 5


Sửa, liên quan đến phản ứng từ Aaron Digulla:

Các tính chất này được sử dụng trong các tập tin cấu hình Spring *. Vì vậy, tôi không thể sử dụng ý tưởng được đưa ra bởi Aaron, vì Spring sẽ được khởi tạo trước khi chạy thử nghiệm.

Ngoài ra, tôi chỉ cần biết liệu tôi có thể đạt được điều đó một cách dễ dàng trong Eclipse hay không. Vì vậy, giải pháp không được có bất kỳ tác động nào đến việc biên dịch ứng dụng bên ngoài Eclipse, vì ứng dụng của tôi cuối cùng sẽ được biên dịch (và thử nghiệm) bởi Maven2.

* vài thử nghiệm "đơn vị" thực sự cần cấu hình Spring của tôi để chạy. Ok, tôi biết rằng đó không phải là các thử nghiệm đơn vị thực tế; o)

Chỉnh sửa 2: Trên thực tế, tôi đã thực sự bắt đầu cấu hình Spring bằng một đơn vị kiểm tra. Vì vậy, trước khi bắt đầu mùa xuân, tôi kiểm tra các thuộc tính hệ thống, và nếu thuộc tính của tôi không được thiết lập, sau đó tôi cung cấp cho họ giá trị cần thiết ...

Tuy nhiên, tôi hơi thất vọng vì Eclipse không thể làm điều đó cho tôi tự động ...

+0

Chỉ cần được rõ ràng liên quan đến kiểm tra lò xo. Những gì OP đang nói về khi sử dụng mùa xuân là "RunWith (SpringJUnit4ClassRunner.class) và ContextConfiguration" sẽ bắt đầu mùa xuân trước khi junit thường xuyên Before và BeforeClass được nhấn để thiết lập thuộc tính hệ thống trong những người sẽ không hoạt động. – sMoZely

Trả lời

7

Giải pháp của tôi là tạo lớp cơ sở thử nghiệm trừu tượng cho tất cả các thử nghiệm trong một dự án mở rộng TestCase. Nó phải được trừu tượng để công cụ tìm kiểm tra đơn vị tự động sẽ không xem xét nó.

Trong khối mã tĩnh của lớp này, tôi đặt tất cả các thuộc tính tôi cần. Điều này đảm bảo rằng mã chạy một lần và chỉ một lần và nó chạy trước bất kỳ thử nghiệm nào trong dự án của tôi.

[EDIT] Bạn nói rằng Spring được khởi tạo trước khi chạy thử nghiệm. Đây là một lỗi trong dự án của bạn: Nó phải là các thử nghiệm khởi tạo Spring. Nếu không, bạn sẽ luôn gặp phải vấn đề mà bạn phải kiểm tra điều gì đó ngoài tầm kiểm soát của mình.

Vì vậy, tôi khuyên bạn nên di chuyển mã init Spring vào một nơi mà bạn có thể gọi nó vào thời điểm khi môi trường sẵn sàng.

Ngoài ra, hãy kiểm tra xem môi trường có được thiết lập chính xác trong thiết lập() và ném lỗi nếu thuộc tính bị thiếu. Bằng cách này, bạn sẽ ít nhất biết lý do tại sao các bài kiểm tra sẽ thất bại sau này. Nhưng tôi vẫn muốn có toàn quyền kiểm soát khi hệ thống con nào đi vào cuộc sống. Bất cứ điều gì khác chỉ cầu xin thiên tai.

+0

Tôi không thể sử dụng ý tưởng của bạn, như được giải thích trong Chỉnh sửa của tôi (tôi không downvote nó vì nó không phải là một ý tưởng tồi, tuy nhiên) ... – romaintaz

+2

Tôi đồng ý với init mã khối tĩnh. Có một lựa chọn khác: @BeforeClass trên một phương thức mà bạn có thể bắt đầu các biến hệ thống của bạn. – zeratul021

7

Khi tôi muốn thiết lập một số mục thuộc tính cho thử nghiệm junit của tôi thực hiện những điều sau

protected void setUp() throws Exception { 
     super.setUp(); 

     System.setProperty("Property1", "value1"); 
     System.setProperty("Property2", "value2"); 
} 

Các thuộc tính được thiết lập trước khi tole thử nghiệm được gọi là

EDIT: Bạn cũng có thể đọc các thuộc tính từ một tệp và tại các thuộc tính hệ thống

+0

Nhận xét giống như câu trả lời của Aaron Digulla. Nó sẽ không hoạt động nếu các thuộc tính được sử dụng bởi Spring ... – romaintaz

+0

Bạn nên khởi tạo tất cả các giá trị và các đối tượng bên trong phương thức thiết lập. Nếu không thì hãy cập nhật testcases. –

1

Tôi chưa bao giờ hiểu tại sao cấu hình khởi chạy có cách xác định biến môi trường nhưng cách duy nhất để thêm thuộc tính hệ thống có vẻ là thêm đối số vm . Cách tôi đã làm việc xung quanh điều này là để có các bài kiểm tra (hoặc một lớp cơ sở kiểm tra trừu tượng) kiểm tra sự hiện diện của các thuộc tính bắt buộc, nếu chúng không có ở đó thì tôi tải chúng từ một tệp .properties trên classpath .

Điều này có tác dụng vì tôi vẫn có thể ghi đè hoặc chỉ định chúng từ ANT hoặc Maven nhưng cũng có thể 'nhấp chuột phải' -> Chạy dưới dạng -> Junit Kiểm tra từng tệp thử nghiệm.

chỉnh sửa: đây là một ví dụ về nhận mùa xuân để tùy tải nộp tính theo cách tương tự như mô tả ở trên:

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location" value="database.properties"/> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="systemPropertiesMode"> 
      <util:constant static-field="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     </property> 
</bean> 
26

Bạn có thể thử này - đi đến

Window->Preferences->Java->Installed JREs 

ans chọn JVM đang sử dụng, thay vì đặt thông số "Default VM" như

-DrunningInEclipse 

Hơn bạn có thể kiểm tra trong TestCase của bạn:

System.getProperty("runningInEclipse") != null 
+0

Điều đó hoạt động! Tuyệt quá! – Wolfgang

+0

Tuyệt vời! Cảm ơn. –

+0

Có cách nào để xác định điều này trên cơ sở từng dự án không? – Stewart

1

đồng ý sử dụng phương pháp theo cách này trong một bài kiểm tra JUnit của tôi và nó làm việc

 


    @BeforeClass 
     public static void setupProperties() { 
      System.setProperty("catalina.base", "C:\\sam-tomcat-7.0.42"); 
     } 

+0

Tôi biết giải pháp này, nhưng nó không tôn trọng các yêu cầu của tôi. Tôi chỉ muốn có một giải pháp cho Eclipse. Sử dụng điều này, nó sẽ có tác động đến việc xây dựng "mặc định" của Maven (tức là bên ngoài IDE). Ngoài ra, nó chỉ hoạt động cho một lớp (hoặc bạn phải thực hiện tất cả các bài kiểm tra của bạn mở rộng lớp định nghĩa '@ BeforeClass' này). – romaintaz

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