2010-08-28 30 views
5

Tôi muốn kiểm tra một số phương pháp lớp có chứa logic phụ thuộc vào thời gian hiện tại nó đang chạy. Tôi muốn đặt thời gian thread/jvm/system thành một ngày cụ thể trong cài đặt JUnit và chạy thử nghiệm của tôi. Ngoài ra tôi muốn điều này là tạm thời. Có ai làm điều này trước khi?Có thể thay đổi thời gian hiện tại của một ví dụ chủ đề hoặc jvm trong java không?

Tôi đã nghĩ đến một cái gì đó tương tự như TimeZone.setDefault (múi giờ)

+0

Chủ đề không có thời gian hiện tại và cũng không thực hiện các JVM. – EJP

Trả lời

2

Tôi không tin rằng có một cách để làm điều này bằng java.util.Date.

Nếu bạn đang sử dụng thời gian joda thì bạn có thể. Xem this

+0

Thời gian Joda dường như là giải pháp đơn giản nhất đối với tôi – Kirby

2

Tôi cũng đang đấu tranh với điều này. Giải pháp tốt nhất mà tôi đã tìm thấy cho đến nay là có một lớp TimeHelper quản lý các công cụ thời gian: như một nhà máy Date, giữ DateFormatters và vân vân để những thứ này không được phân phối trên codebase.

Với Easymock hoặc một khuôn mẫu giả khác, sau đó nó đơn giản để kiểm tra các nội dung liên quan đến thời gian.

0

Bạn đang đi về điều này một cách sai lầm. Các phương thức lớp học của bạn phải chấp nhận giá trị long đại diện cho thời gian - chúng không được chấp nhận TimeZone. Nếu bạn refactor phương pháp của bạn để được tách rời từ thực tế là họ nhận được 'thời gian' từ TimeZone, sau đó bạn có thể dễ dàng kiểm tra phương pháp của bạn mà không cần phải làm những gì bạn đang cố gắng làm bây giờ; bạn chỉ cần gọi các phương thức của mình với các giá trị được xác định trước là long đại diện cho một thời điểm cụ thể, thay vì sau đó gọi chúng với đối tượng TimeZone có giá trị mặc định là thứ đã được xác định trước mà bạn muốn kiểm tra.

Bạn cần tách các phương thức nhận thông số 'thời gian' từ nguồn cung cấp giá trị thời gian đó. Bằng cách này, bạn có thể chạy mã của mình trong khi sử dụng TimeZone hoặc thời gian hệ thống hiện tại và bạn có thể kiểm tra mã của mình trong khi sử dụng các giá trị thời gian được xác định trước mà bạn muốn kiểm tra.

Hãy tiếp tục và thử tái cấu trúc mã của bạn và xem bạn có thể đạt được các khả năng mong muốn hay không - bạn sẽ có thể. Hãy quay lại với bất kỳ câu hỏi nào khác và chúng tôi sẽ rất vui được trợ giúp!

Chúc may mắn.

4

Bạn có thể sử dụng AspectJ và phương pháp quấn quanh java.lang.System.currentTimeMillis(), java.util.Date.new()java.util.Calendar.getInstance() điều chỉnh thời gian theo nhu cầu của bạn.

+0

+1 Tôi đã thử điều này một thời gian. –

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