2016-03-10 14 views
6

waitForCondition() trên lớp Solo trong Robotium sử dụng một đối tượng Sleeper để ngủ một luồng giữa việc kiểm tra một điều kiện. Lớp Sleeper có PAUSE được định nghĩa là 500 mili giây. Tôi muốn hạ thấp điều đó, lý tưởng là không tải mã nguồn Robotium, thay đổi nó, và biên dịch lại Robotium.Robotium - tùy chỉnh thời lượng PAUSE trong lớp Sleeper

Tôi đã thử mở rộng lớp Solo và xây dựng lớp Waiter của riêng mình sẽ sử dụng đối tượng Sleeper tùy chỉnh với khoảng thời gian ngủ thấp hơn, nhưng Waiter có quyền truy cập cấp gói để tuyến này không khả dụng.

Từ khóa cuối cùng sang một bên, this commit message dường như cho biết rằng cấu hình tùy chỉnh nên (hoặc đang đến) nhưng tôi không thấy bất kỳ cách nào để tùy chỉnh các hằng số đó trong Solo.Config class.

Có ai có giải pháp nào không? Cảm ơn!

Cập nhật: @ câu trả lời của vRallev dưới đây hoàn thành công việc bằng cách phản ánh. Tôi đã thực hiện một số pull request đã được hợp nhất thành Robotium ngay hôm nay. Trong bản phát hành tiếp theo, bạn sẽ có thể cấu hình thời gian ngủ với lớp Config.

+0

nếu bạn chỉ muốn ghi đè lên thời gian ngủ của "waitForCondition" thay vì tất cả chờ đợi functoin, tại sao bạn không chỉ cần tạo chức năng chờ đợi của riêng bạn? –

+0

Bởi vì sau đó tôi có hiệu quả làm những gì tôi nói tôi không muốn làm: lấy mã nguồn Robotium, thay đổi nó, và biên dịch lại. – Mark

+0

Tôi có nghĩa là bạn có thể tạo một hàm mới trong một lớp tùy chỉnh mới thay vì chỉnh sửa mã nguồn. Logic đằng sau "waitForCondition" khá rõ ràng và dễ thực hiện. Nó sẽ không yêu cầu bạn biên dịch lại nó. –

Trả lời

5

Ngay cả khi lớp Waiter hoặc Sleeper được công khai, bạn không thể thay đổi giá trị. Lý do là trường waiter trong lớp Solo là cuối cùng và hàm tạo nơi giá trị được gán là riêng tư.

Cách duy nhất để hack điều này là với sự phản ánh. Tôi đã thử giải pháp dưới đây và nó hoạt động. Chú ý gói của cả hai lớp!

package com.robotium.solo; 

import java.lang.reflect.Field; 

public class SoloHack { 

    private final Solo mSolo; 

    public SoloHack(Solo solo) { 
    mSolo = solo; 
    } 

    public void hack() throws NoSuchFieldException, IllegalAccessException { 
    Field field = mSolo.waiter.getClass().getDeclaredField("sleeper"); 
    field.setAccessible(true); 

    // Object value = field.get(mSolo.waiter); 
    // Class<?> aClass = value.getClass(); 

    field.set(mSolo.waiter, new SleeperHack()); 

    // Object newValue = field.get(mSolo.waiter); 
    // Class<?> newClass = newValue.getClass(); 
    } 
} 

package com.robotium.solo; 

public class SleeperHack extends Sleeper { 

    @Override 
    public void sleep() { 
    sleep(50); 
    } 
} 
+0

Giải pháp tuyệt vời! Cảm ơn rất nhiều! – Mark

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