为什么当 运行 bazel 测试 java_test 规则时 Bazel 找不到我的测试 class?

Why can't Bazel find my test class when running bazel test on a java_test rule?

我在 src/handlers/MyHttpHandlerTest.java 中定义了一个测试 class(抱歉,我知道最好将测试放在 tests 目录中)。

这是我的 src/handlers/BUILD 文件:

java_test(
    name = "MyHttpHandlerTest",
    srcs = [
        "MyHttpHandler.java",
        "MyHttpHandlerTest.java",
    ],
    deps = [
        "//:java_test_deps",
        "//src/messages",
    ],
)

我的测试 class 在 src/handlers/MyHttpHandlerTest.java 中定义如下(它目前没有声明任何东西——我只是想测试我安装的 junit 和 Mockito):

package src.handlers;

import com.sun.net.httpserver.HttpExchange;
import src.messages.Message;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import java.io.IOException;

@ExtendWith(MockitoExtension.class)
public class MyHttpHandlerTest {

    @Mock
    Message message;

    @Mock
    HttpExchange exchange;

    @Test
    public void testGetMessage() throws IOException {
        MyHttpHandler handler = new MyHttpHandler();
        when(message.getMessage()).thenReturn("Hello world!");
        handler.setMessage(message);
        handler.handle(exchange);
    }
}

当我运行bazel test //src/handlers:MyHttpHandlerTest时,它成功编译了源文件,但是returns错误:

Class not found: [handlers.MyHttpHandlerTest]

为什么 bazel 找不到这个 class?

Bazel 猜测 Java 包层次结构的根是 src 文件夹,因此尝试加载 handlers.MyHttpHandlerTest。因此,要么将包实际更改为 handlers,要么使用 test_class 属性覆盖 Bazel 的启发式算法:

java_test(
    name = "MyHttpHandlerTest",
    srcs = [
        "MyHttpHandler.java",
        "MyHttpHandlerTest.java",
    ],
    deps = [
        "//:java_test_deps",
        "//src/messages",
    ],
    test_class = "src.handlers.MyHttpHandlerTest",
)