gpt4 book ai didi

java - 使用 Guice 创建与 ThreadWeaver 一起使用的组件

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:34 24 4
gpt4 key购买 nike

我一直在处理的应用程序变得越来越复杂,以至于我在并发方面一遍又一遍地遇到同样的问题。解决相同的问题而不进行任何回归测试不再有意义。

那是我发现 ThreadWeaver 的时候。对于我编写的一些简单的并发案例来说,它真的很棒,但是当我尝试用我的生产代码做一些更复杂的案例时,我开始感到沮丧。具体来说,在使用 Guice 注入(inject)组件时。

我很难理解 ThreadWeaver 运行测试的方式的含义,并在 wiki 文档中寻找任何提及 Guice 或 DI 的地方,但没有成功。

Guice 与 ThreadWeaver 兼容吗?

这是我的测试

@Test
public void concurrency_test() {
AnnotatedTestRunner runner = new AnnotatedTestRunner();
runner.runTests(OPYLWeaverImpl.class, OPYLSurrogateTranscodingService.class);
}

这是我的测试实现

public class OPYLWeaverImpl extends WeaverFixtureBase {

@Inject private TaskExecutor taskExecutor;
@Inject private Serializer serializer;
@Inject private CountingObjectFileMarshaller liveFileMarshaller;
@Inject private GraphModel graphModel;
@Inject private CountingModelUpdaterService updaterService;
@Inject private BabelCompiler babelCompiler;
@Inject private EventBus eventBus;

OPYLSurrogateTranscodingService service;

private Path testPath;

@ThreadedBefore
public void before() {
service = new OPYLSurrogateTranscodingService(eventBus, taskExecutor, serializer, liveFileMarshaller,
() -> new OPYLSurrogateTranscodingService.Importer(graphModel, babelCompiler, updaterService, eventBus),
() -> new OPYLSurrogateTranscodingService.Validator(eventBus, babelCompiler),
() -> new OPYLSurrogateTranscodingService.Exporter(graphModel, updaterService));
}

@ThreadedMain
public void mainThread() {
testPath = FilePathOf.OASIS.resolve("Samples/fake-powershell-unit-test.opyl");
service.applyToExistingGraphModel(testPath);
}

@ThreadedSecondary
public void secondaryThread() {

}

@ThreadedAfter
public void after() {

}

WeaverFixtureBase

public class WeaverFixtureBase {
@Inject protected CountingEventBus eventBus;

@Before public final void setupComponents() {
Injector injector = Guice.createInjector(new WeaverTestingEnvironmentModule(CommonSerializationBootstrapper.class));
injector.getMembersInjector((Class) this.getClass()).injectMembers(this);
}
private class WeaverTestingEnvironmentModule extends AbstractModule {

private final Class<? extends SerializationBootstrapper> serializationBootstrapper;

public WeaverTestingEnvironmentModule(Class<? extends SerializationBootstrapper> serializationConfiguration) {
serializationBootstrapper = serializationConfiguration;
}

@Override protected void configure() {
bind(TaskExecutor.class).to(FakeSerialTaskExecutor.class);
bind(SerializationBootstrapper.class).to(serializationBootstrapper);
bind(ModelUpdaterService.class).toInstance(new CountingModelUpdaterService());
bindFactory(StaticSerializationConfiguration.Factory.class);

CountingEventBus localEventBus = new CountingEventBus();

bind(Key.get(EventBus.class, Bindings.GlobalEventBus.class)).toInstance(localEventBus);
bind(Key.get(EventBus.class, Bindings.LocalEventBus.class)).toInstance(localEventBus);
bind(CountingEventBus.class).toInstance(localEventBus);
bind(EventBus.class).toInstance(localEventBus);

}
@Provides
@Singleton
public GraphModel getGraphModel(EventBus eventBus, Serializer serializer) {
return MockitoUtilities.createMockAsInterceptorTo(new GraphModel(eventBus, serializer));
}
}

但是当类加载器加载 OPYLWeaverImpl 时,Guice 的所有东西都没有消失,我得到了一大堆空值。

我觉得这是一种“缺少一些非常简单的东西”的场景。对不起,如果是!

最佳答案

上面的评论是对的。 Thread-weaver 完全不了解 JUnit。 Thread weaver 是它自己的运行器,它根据自己的注释执行测试用例。您不得在 Thread Weaver 测试中使用任何特定于 JUnit 的注释。

除此之外,Thread Weaver 不需要任何特定框架的兼容性。它操纵 Java 字节代码并使用 aeperate 类加载器加载操纵的代码。

最后,没有任何二次测试的 Thread Weaver 测试没有任何意义。 Thread weaver 通过交错单独的执行路径来工作。如果没有第二个线程,Thread Weaver 只会单步执行一个线程,而不会添加任何值。

关于java - 使用 Guice 创建与 ThreadWeaver 一起使用的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com