Tôi có một trường hợp thử nghiệm JUnit trong một dự án Android có chứa mã trông như thế này:'private static thức' thành viên của Android đơn vị kiểm tra giá trị thay đổi lớp null
private static final URI TEST_RESOURCE_URL = TasksService.TASKLIST_RESOURCELIST_URL.resolve("task/test.task");
public void setUp() {
Log.i("Test", "TEST_RESOURCE_URL=" + TEST_RESOURCE_URL);
}
lớp thử nghiệm này có nhiều phương pháp thử , một số tham chiếu đến (nhưng không cố gắng sửa đổi) giá trị của hằng số này. Tuy nhiên, khi tôi chạy những thử nghiệm này (Android 2.2.2), tất cả các xét nghiệm nhưng một trong những đầu tiên thất bại, và logcat cho tôi thấy điều này:
03-03 18:56:41.791: I/Test(12008): TEST_RESOURCE_URL=http://apate.meridiandigital.net/tasks/task/test.task
03-03 18:56:42.101: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.131: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.151: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.281: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.311: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.341: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.361: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.391: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.391: I/Test(12008): TEST_RESOURCE_URL=null
như thế nào một trận chung kết có giá trị thay đổi lĩnh vực tĩnh như thế này? Làm cách nào để ngăn điều này xảy ra? Có những tình huống khác mà nó có thể xảy ra không?
--- EDIT 1
bây giờ tôi đã tỉa mã xuống một ví dụ nhỏ có thể được đưa vào toàn bộ. Xem bên dưới:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
public class StaticFinalTest extends ServiceTestCase<MyService> {
public StaticFinalTest() {
super(MyService.class);
}
public static final Object CONST2 = new Object();
public void testA()
{
assertNotNull (CONST2);
}
public void testB()
{
assertNotNull (CONST2);
}
}
Khi thử nghiệm này chạy, testA vượt qua nhưng testB không thành công. Nếu testA được nhận xét, testB sẽ vượt qua.
Điều quan trọng là nó là ServiceTestCase. Một JUnit TestCase tiêu chuẩn không gây ra vấn đề. Nếu 'CONST2' là một Chuỗi, cả hai bài kiểm tra đều như mong đợi. Bất kỳ loại tài liệu tham khảo nào khác dường như tái tạo vấn đề.
Lớp học thử nghiệm có thể không được tải và tải lại không? Thậm chí Dalvik có thể làm điều đó không? Có lẽ hằng số của bạn đang bị che khuất bởi cái gì khác? – nmr
Không có gì khác có cùng tên trong bất kỳ dự án nào, vì vậy tôi không nghi ngờ đó là vấn đề về bóng tối. Tôi nghĩ rằng JUnit không cố gắng để tải lại các lớp học giữa chạy thử nghiệm, mặc dù, bằng cách sử dụng một ClassLoader khác nhau cho mỗi lời gọi. Vì vậy, trường * có thể * là một thể hiện khác từ lần chạy thứ hai trở đi.Trong trường hợp đó, vấn đề là ít hơn nó đã thay đổi, và nhiều hơn nữa mà initialiser đã không chạy lần thứ hai xung quanh. – Jules
Không, JUnit không tải lại các lớp, nó chỉ tái khởi tạo lớp trước mỗi phương thức. –