Nhận bối cảnh của dự án thử nghiệm trong trường hợp thử nghiệm Android junit


107

Có ai biết làm thế nào bạn có thể lấy bối cảnh của dự án Thử nghiệm trong trường hợp thử nghiệm Android junit (mở rộng AndroidTestCase).

Lưu ý: Bài kiểm tra KHÔNG phải là bài kiểm tra thiết bị đo.

Lưu ý 2: Tôi cần bối cảnh của dự án thử nghiệm, không phải bối cảnh của ứng dụng thực tế được thử nghiệm.

Tôi cần cái này để tải một số tệp từ nội dung từ dự án thử nghiệm.


Tại sao bạn không thể chỉ sử dụng InstrumentationTestCase?
yorkw

1
Bởi vì tôi đang thử nghiệm các dịch vụ, không phải UI.
peceps

1
Có một câu trả lời hay hơn được tìm thấy ở đây: [Sử dụng AndroidTestCase thay vì kiểm tra JUnit] [1] [1]: stackoverflow.com/questions/3170706/…
Jaime Botero

Câu trả lời:


135

Có cách tiếp cận mới với Thư viện hỗ trợ kiểm tra Android (hiện tại androidx.test:runner:1.1.1). Ví dụ cập nhật Kotlin:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

    @Before
    fun setup() {
        instrumentationContext = InstrumentationRegistry.getInstrumentation().context
    }

    @Test
    fun someTest() {
        TODO()
    }
}

Nếu bạn muốn cũng chạy ngữ cảnh ứng dụng:

InstrumentationRegistry.getInstrumentation().targetContext

Ví dụ đang chạy đầy đủ: https://github.com/fada21/AndroidTestContextExample

Hãy xem ở đây: Sự khác biệt giữa getTargetContext () và getContext (trên InstrumentationRegistry) là gì?


Cuối cùng là câu trả lời về cách sử dụng JUnit4 với InstrumentationTest. Sau nhiều giờ tìm kiếm. Gotta thích phát triển Android.
Fabian Zeindl

1
Đẹp! tx (lưu ý rằng thành viên trong lớp của bạn có lỗi đánh máy)
Greg

1
Ai đó có thể giúp về những phụ thuộc nào cần được thêm vào tệp gradle để điều này hoạt động không?
Greg

1
Đừng quên thêm compile "com.android.support.test:runner:1.0.1"để gradle của bạn
egorikem

2
Nó không được dùng nữa, hãy sử dụng InstrumentationRegistry.getInstrumentation().contextthay thế.
Allan Veloso

37

Sau một số nghiên cứu, giải pháp hoạt động duy nhất dường như là giải pháp mà yorkw đã chỉ ra. Bạn sẽ phải mở rộng InstrumentationTestCase và sau đó bạn có thể truy cập ngữ cảnh của ứng dụng thử nghiệm của mình bằng cách sử dụng getInticmentation (). GetContext () - đây là một đoạn mã ngắn gọn sử dụng các đề xuất ở trên:

public class PrintoutPullParserTest extends InstrumentationTestCase {

    public void testParsing() throws Exception {
        PrintoutPullParser parser = new PrintoutPullParser();
        parser.parse(getInstrumentation().getContext().getResources().getXml(R.xml.printer_configuration));
    }
}

7
Có nhưng có vẻ ngớ ngẩn khi Android không cung cấp quyền truy cập vào ngữ cảnh dự án thử nghiệm trong các thử nghiệm JUnit đơn giản. Bối cảnh có trong AndroidTestCase.mTestContext nhưng nó là riêng tư. Tôi không hiểu tại sao.
peceps

@peceps Full Ack - nhưng thats như thế nào nó là gì và tôi không thích nó không;)
AgentKnopf

25

Như bạn có thể đọc trong mã nguồn AndroidTestCase , getTestContext()phương pháp này bị ẩn.

/**
 * @hide
 */
public Context getTestContext() {
    return mTestContext;
}

Bạn có thể bỏ qua @hidechú thích bằng cách sử dụng phản chiếu.

Chỉ cần thêm phương thức sau vào của bạn AndroidTestCase:

/**
 * @return The {@link Context} of the test project.
 */
private Context getTestContext()
{
    try
    {
        Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
        return (Context) getTestContext.invoke(this);
    }
    catch (final Exception exception)
    {
        exception.printStackTrace();
        return null;
    }
}

Sau đó gọi getTestContext()bất kỳ lúc nào bạn muốn. :)


2
Làm việc một cách hoàn hảo đối với tôi và tôi tải các tài sản sử dụng bối cảnh một trong hai AndroidTestCase qua phương pháp này, hoặc ActivityInstrumentationTestCase2.getInstrumentation () .getContext () sau đó getResources () .getAssets ()
Andrew Mackenzie

Bạn có thể suy đoán tại sao họ lại giấu nó đi không? Nếu chúng tôi sử dụng kỹ thuật này, liệu họ có thể loại bỏ phương pháp này trong bản phát hành sau (phá vỡ mã thử nghiệm của chúng tôi) không?
Andrew Shepherd,

1
Tôi nhận đượcjava.lang.NoSuchMethodException: android.test.ServiceTestCase.getTestContext()
kurdtpage

4

Cập nhật: AndroidTestCase Lớp này không được dùng nữa trong API cấp 24. Hãy sử dụng InstrumentationRegistrythay thế. Các bài kiểm tra mới sẽ được viết bằng Thư viện hỗ trợ kiểm tra Android. Liên kết đến thông báo

Bạn nên mở rộng từ AndroidTestCase thay vì TestCase.

Tổng quan về lớp AndroidTestCase
Mở rộng phần này nếu bạn cần truy cập Tài nguyên hoặc những thứ khác phụ thuộc vào Ngữ cảnh hoạt động.

AndroidTestCase - Nhà phát triển Android


4

Nếu muốn lấy bối cảnh bằng Kotlin và Mockito, bạn có thể thực hiện theo cách sau:

val context = mock(Context::class.java)

Tôi hy vọng nó sẽ giúp bạn


nhận được null trong ngữ cảnh?
Deven

Và đừng quên chú thích bạn kiểm tra lớp học với @RunWith (MockitoJUnitRunner :: class)
USMAN osman

2

Đây là cách chính xác để có được Ngữ cảnh. Các phương pháp khác đã không còn được dùng nữa

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context

2
import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();

1

Đối với những người gặp phải những sự cố này khi tạo kiểm tra tự động, bạn phải thực hiện điều này:

    Context instrumentationContext;

    @Before
    public void method() {

        instrumentationContext = InstrumentationRegistry.getInstrumentation().getContext();

        MultiDex.install(instrumentationContext);
    }

0

Các câu trả lời khác đã lỗi thời. Ngay bây giờ mỗi khi bạn mở rộng AndroidTestCase, có đối tượng Ngữ cảnh mContext mà bạn có thể sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.