小编osc*_*car的帖子

如何测试弹簧配置类?

我有一个spring应用程序配置类,其中实例bean.

应用类:

@Configuration
@EnableAspectJAutoProxy
@EnableSpringDataWebSupport
@EnableTransactionManagement
@ComponentScan(basePackageClasses = Application.class)
@PropertySource(value = {"classpath:foo.properties"})
@EnableJpaRepositories(basePackageClasses = Application.class)
@EnableJpaAuditing
public class Application {

    @Inject
    private Environment env;

    @Bean
    JndiTemplate jndiTemplate() {
        return new JndiTemplate();
    }

    @Bean
    public DataSource dataSource() {        
        DataSource dataSource = getDataSource();
        if (dataSource == null) {
            dataSource = new BasicDataSource();
            ((BasicDataSource) dataSource).setUsername(env.getProperty("jdbc.user"));
            ((BasicDataSource) dataSource).setPassword(env.getProperty("jdbc.password""));

            ((BasicDataSource) dataSource).setDriverClassName(env.getProperty("jdbc.driverClassName"));
            ((BasicDataSource) dataSource).setUrl(env.getProperty("jdbc.url"));
        }
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        EntityManagerFactory factory = entityManagerFactory().getObject();
        return new JpaTransactionManager(factory);
    }

    //....
}
Run Code Online (Sandbox Code Playgroud)

MvcConfiguration类:

@Configuration
@ComponentScan(basePackageClasses …
Run Code Online (Sandbox Code Playgroud)

java junit spring spring-mvc

12
推荐指数
3
解决办法
3万
查看次数

使用JUnit测试控制器和服务的最佳方法是什么?

我有这个Spring MVC控制器:

@Controller
@RequestMapping(value = "/foo")
public class FooController {

    @Inject
    private FooService fooService;

    @RequestMapping(value = "foo/new")
    public final String add(final ModelMap model) {
        model.addAttribute(fooService.createFoo());
        return "foo/detail";
    }

    @RequestMapping(value = "foo/{id}")
    public final String detail(final ModelMap model, @PathVariable long id) {
        model.addAttribute(fooService.findById(id));
        return "foo/detail";
    }

    @RequestMapping(value="foo/update", method=RequestMethod.POST)
    public final String save(@Valid @ModelAttribute final Foo foo, final BindingResult result, final SessionStatus status,
            final RedirectAttributes ra, final HttpServletRequest request) {

        if (result.hasErrors()) {
            return "foo/detail";
        }

        fooService.save(foo);
        status.setComplete();
        Message.success(ra, "message.ok");

        return "redirect:foo/list"; …
Run Code Online (Sandbox Code Playgroud)

java junit spring

11
推荐指数
2
解决办法
1万
查看次数

使用mockmvc和junit添加csrf标记

我有两个metas的视图(我使用的是thymeleaf):

    <meta name="_csrf" th:content="${_csrf.token}" />
    <meta name="_csrf_header" th:content="${_csrf.headerName}" />
Run Code Online (Sandbox Code Playgroud)

在我的测试控制器中,我这样做:

HttpSessionCsrfTokenRepository httpSessionCsrfTokenRepository = new HttpSessionCsrfTokenRepository();
CsrfToken csrfToken2 = httpSessionCsrfTokenRepository.generateToken(new MockHttpServletRequest());

CustomUser user = new CustomUser();
user.setName("foo");
user.setSurname("fooo");
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
grantedAuthorities.add(new SimpleGrantedAuthority("role"));

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("foo", "fooo", grantedAuthorities);
token.setDetails(user);     

MockHttpSession session = new MockHttpSession();
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, new MockSecurityContext(token));
session.setAttribute("_csrf", csrfToken2);


this.mockMvc.perform(post("/foo/update")
            .param("param", "asdfasd")
            ....
            .session(session)
            )
        .andExpect(view().name(("foo/detail"))).andExpect(model().hasErrors())  
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我收到此错误(未找到令牌或为空):

org.springframework.web.util.NestedServletException:请求处理失败; 嵌套异常是org.thymeleaf.exceptions.TemplateProcessingException:异常评估SpringEL表达: "_csrf.token"(布局/默认:4)在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)在有机springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)位于org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java)的javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 843)在org.springframework.mock.web.MockFilterChain的javax.servlet.http.HttpServlet.service(HttpServlet.java:790)的org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65) $ ServletFilterProxy.doFilter(MockFilterChain.java:167)org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:144) )在es.xunta.amtega.axipro.web.controller.SolicitudeControllerSaveTest.testSaveValidator(Solicitu)deControllerSaveTest.java:144)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java .lang.reflect.Method.invoke(Method.java:601)在org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)在org.junit.internal.runners.model.ReflectiveCallable.run( ReflectiveCallable.java:12)在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)在org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)在org.junit org.springframework.test.context.junit4上的org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)中的.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) .statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)在org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:70)在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)在org.springframework.test.context.junit4 .SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:224)org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)at org.junit.runners.ParentRunner $ …

junit spring spring-security mockito mockmvc

7
推荐指数
2
解决办法
5173
查看次数

获取运行异步方法的用户

我正在尝试从应用程序spring的spring上下文中获取用户,如下所示:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Run Code Online (Sandbox Code Playgroud)

问题在于方法是异步的,带有注释@Async:

@Service
@Transactional
public class FooServiceImpl implements FooService {

    @Async("asyncExecutor")
    public void fooMethod(String bar) {
        System.out.println("Foo: " + bar);
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题在于异步方法在另一个上下文中的另一个线程中运行。我尝试使用SecurityContextDelegationAsyncTaskExecutor。用户将传播到异步方法,但是如果我注销,则异步方法中的用户为null。这是我的代码:

@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {

    @Override
    @Bean(name = "asyncExecutor")
    public Executor getAsyncExecutor() {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        executor.setMaxPoolSize(1);
        executor.setThreadGroupName("MyCustomExecutor");
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setBeanName("asyncExecutor");
        executor.initialize();

        return new DelegatingSecurityContextAsyncTaskExecutor(executor);
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }
}
Run Code Online (Sandbox Code Playgroud)

我还使用了ThreadPoolTask​​Executor并通过“ MODE_INHERITABLETHREADLOCAL”设置了弹簧安全性的上下文。但是结果是一样的。如果我登录到应用程序,则用户不为null。如果未登录,则用户为null。我真的希望运行该方法的用户,而不是当前登录的用户。我的代码:

@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer …
Run Code Online (Sandbox Code Playgroud)

java spring asynchronous spring-security

6
推荐指数
2
解决办法
1410
查看次数

如何在vertx中重构异步调用链,以避免回调地狱

我有以下代码,这些代码具有相互依赖的几个异步调用(例如,调用可以是apis REST),最后处理所有结果。这是我的示例代码:

private void foo1(String uuid, Handler<AsyncResult<JsonObject>> aHandler) {
    //call json api, for example
    JsonObject foo1 = new JsonObject();
    foo1.put("uuid", "foo1");
    aHandler.handle(Future.succeededFuture(foo1));
 }

private void foo2(String uuid, Handler<AsyncResult<JsonObject>> aHandler) {

    //call json api, for example
    JsonObject foo2 = new JsonObject();
    foo2.put("uuid", "foo2");
    aHandler.handle(Future.succeededFuture(foo2));
 }

private void foo3(String uuid, Handler<AsyncResult<JsonObject>> aHandler) {

    //call json api, for example
    JsonObject foo3 = new JsonObject();
    foo3.put("uuid", "foo3");
    aHandler.handle(Future.succeededFuture(foo3));
 }

private void doSomething(JsonObject result1, JsonObject result2, JsonObject result3, Handler<AsyncResult<JsonObject>> aHandler) {
    JsonObject finalResult =new JsonObject(); …
Run Code Online (Sandbox Code Playgroud)

java asynchronous callback vert.x

6
推荐指数
1
解决办法
1615
查看次数

用Maven替换JAVA代码中的某个常量,无需修改原代码

我在 java 常量中有一个文本,我想根据在生成工件时配置的 Maven 变量来替换该文本,方法如下:

public class FOO {
    public static final String BASE = "/@FOO@";
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我替换java代码,它就会被永远替换并且不再执行替换,所以如果我更改变量的值它没有效果:

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>replace</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <includes>
            <include>${basedir}/src/main/java/com/my/package/Constants.java</include>
        </includes>
        <replacements>
            <replacement>
                <token>@FOO@</token>
                <value>${my.custom.property}</value>
            </replacement>
        </replacements>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我通过相反的过程解决了这个问题:

 <plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
        <execution>
            <id>first-execution</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>replace</goal>
            </goals>
            <configuration>
                <includes>
                    <include>${basedir}/src/main/java/com/my/package/Constants.java</include>
                </includes>
                <replacements>
                    <replacement>
                        <token>@FOO@</token>
                        <value>${my.custom.property}</value>
                    </replacement>
                </replacements>
            </configuration>                        
        </execution>
        
        <execution>
            <id>second-execution</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>replace</goal>
            </goals>
            <configuration>
                <includes>
                    <include>${basedir}/src/main/java/com/my/package/Constants.java</include>
                </includes>
                <replacements>
                    <replacement>
                        <token>${my.custom.property}</token>
                        <value>@FOO@</value> …
Run Code Online (Sandbox Code Playgroud)

java maven maven-replacer-plugin

6
推荐指数
1
解决办法
2202
查看次数

使用评论中的关键字关闭 github 上的问题

我试图使用评论中的关键字来解决项目中的问题,但它不起作用。我已经通过命令行尝试了 SourceTree 和 git,结果是相同的。我尝试过以下选项:关闭#1、关闭#1 和修复#1。

例如:

git commit -am "close issue fixes #1"
Run Code Online (Sandbox Code Playgroud)

我在一个分支上工作,而不是在主干上工作。是否应该在 GitHub 存储库中配置某些内容?

git github atlassian-sourcetree

6
推荐指数
1
解决办法
2943
查看次数

如何使用 MockMVC 在 ConstraintValidator 中注入 bean?

我有一个自定义 ConstraintValidator:

@Component
public class FooValidator implements ConstraintValidator<FooAnnotation, String> {

    @Inject
    private FooRepository fooRepository;

    @Override
    public void initialize(FooAnnotation foo) {
    }

    @Override
    public boolean isValid(String code, ConstraintValidatorContext context) {

        Foo foo = fooRepository.findByCode(code);
        //My code
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的 Junit 测试和 MockMVC 中,我调用了 url,但 fooRepository bean 验证器始终为 null。

如何将其注入我的测试控制器中?我尝试创建一个模拟存储库,但它也是空的。我的源码测试:

public class FooControllerTest {

    @InjectMocks
    private FooController fooController;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        // Process mock annotations
        MockitoAnnotations.initMocks(this);

        // Setup Spring test in standalone mode
        this.mockMvc = MockMvcBuilders.standaloneSetup(fooController)
                .setCustomArgumentResolvers(new …
Run Code Online (Sandbox Code Playgroud)

junit spring spring-mvc mockito

5
推荐指数
1
解决办法
743
查看次数

NullHandling.NULLS_LAST不起作用

我正在尝试添加具有空值的列表管理,具有空值的结果必须保留在最后。在SQL查询中以两种不同的方式将选项添加到Order类,但是什么也没有出现。我使用的是Oracle,如果默认情况下从管理数据库启动的咨询具有空值结果,则将其列出。

这是我的代码:

List<Order> orders = new ArrayList<Order>();
orders.add(new Order(Direction.DESC, "points"));

//THIS
orders.add(new Order(Direction.DESC, "person.date", NullHandling.NULLS_LAST));
//OR THIS
orders.add(new Order(Direction.DESC, "person.date").nullsLast());
//NOT WORKING 

orders.add(new Order(Direction.DESC, "id"));
List<Foo> foos = fooRepository.findAll(new Sort(orders));
Run Code Online (Sandbox Code Playgroud)

如何指定空结果应该结尾?

sql spring hibernate spring-data spring-data-jpa

5
推荐指数
2
解决办法
2574
查看次数

使用 Mqttclient 异步并发处理多个消息传递

我正在开发一个使用来自 MQTT 主题的消息的程序,我的目标是可以异步使用和处理多个消息。

我正在使用 eclipse 客户端: https://www.eclipse.org/paho/files/javadoc/org/eclipse/paho/client/mqttv3/MqttClient.html https://www.eclipse.org/paho/files/ javadoc/org/eclipse/paho/client/mqttv3/MqttAsyncClient.html

问题是多个消息不是同时处理的,它们都在同一个线程中执行。我不太明白使用 MqttClient 和 MqttAsyncClient 之间的区别。javadoc 说:

Mqtt客户端

轻量级客户端,用于使用阻塞方法与 MQTT 服务器通信,直至操作完成。

Mqtt异步客户端

轻量级客户端,用于使用非阻塞方法与 MQTT 服务器通信,允许操作在后台运行。

我也不太清楚使用方法“subscribe”或“setCallback”之间的区别。只有通过“subscribe”你才能声明多个Listener:setCallback

设置回调侦听器以用于异步发生的事件。订阅 订阅主题...

它已尝试同时发送十条消息。我的测试如下:

public class FooListener implements IMqttMessageListener {
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        System.out.println("Thread [ " + Thread.currentThread().getName() + 
                "], Topic[ "+ topic + "],  Message [" + message +"] ");
    }
}

public class FooCallbackListener implements MqttCallback {

    @Override
    public void connectionLost(Throwable e) {
        e.printStackTrace();
    }

    @Override
    public void …
Run Code Online (Sandbox Code Playgroud)

java multithreading mqtt paho

4
推荐指数
1
解决办法
3930
查看次数