diff --git a/tests/Fixtures/Controller/CustomController.php b/tests/Fixtures/Controller/CustomController.php
index 40ac22fe2cdb37ef4c09b23e6e1f7b4d29b2ed5c..63748f70f5a89ae50b1e874964efb28c8a4f4b26 100644
--- a/tests/Fixtures/Controller/CustomController.php
+++ b/tests/Fixtures/Controller/CustomController.php
@@ -21,8 +21,7 @@
 
 namespace Irstea\NgModelGeneratorBundle\Tests\Fixtures\Controller;
 
-use Irstea\NgModelGeneratorBundle\Tests\Fixtures\ValueObject\InputDTO;
-use Irstea\NgModelGeneratorBundle\Tests\Fixtures\ValueObject\OutputDTO;
+use Irstea\NgModelGeneratorBundle\Tests\Fixtures\Entity\EntityWithCustomMethods;
 
 /**
  * Class CustomController.
@@ -30,19 +29,19 @@ use Irstea\NgModelGeneratorBundle\Tests\Fixtures\ValueObject\OutputDTO;
 final class CustomController
 {
     /**
-     * @param InputDTO $input
+     * @param EntityWithCustomMethods $input
      *
-     * @return OutputDTO
+     * @return EntityWithCustomMethods
      */
-    public function customItem(InputDTO $input): OutputDTO
+    public function customItem(EntityWithCustomMethods $input): EntityWithCustomMethods
     {
-        return new OutputDTO();
+        return new EntityWithCustomMethods();
     }
 
     /**
-     * @param InputDTO[] $inputs
+     * @param EntityWithCustomMethods[] $inputs
      *
-     * @return OutputDTO[]
+     * @return EntityWithCustomMethods[]
      */
     public function customCollection(array $inputs): array
     {
diff --git a/tests/Fixtures/Entity/EntityWithCustomMethods.php b/tests/Fixtures/Entity/EntityWithCustomMethods.php
index 193cb23c2643028320cfc7d416c917e1e9d5f62f..a118e02b81812a11feba476eabdfbbdeee9c7f29 100644
--- a/tests/Fixtures/Entity/EntityWithCustomMethods.php
+++ b/tests/Fixtures/Entity/EntityWithCustomMethods.php
@@ -22,8 +22,6 @@
 namespace Irstea\NgModelGeneratorBundle\Tests\Fixtures\Entity;
 
 use ApiPlatform\Core\Annotation as API;
-use Irstea\NgModelGeneratorBundle\Tests\Fixtures\ValueObject\InputDTO;
-use Irstea\NgModelGeneratorBundle\Tests\Fixtures\ValueObject\OutputDTO;
 use Ramsey\Uuid\Uuid;
 use Ramsey\Uuid\UuidInterface;
 
@@ -33,18 +31,18 @@ use Ramsey\Uuid\UuidInterface;
  * @API\ApiResource(
  *     itemOperations={
  *         "get",
+ *         "put",
+ *         "delete",
  *         "custom": {
  *             "method": "PUT",
- *             "input": InputDTO::class,
- *             "output": OutputDTO::class,
  *             "controller": "Irstea\NgModelGeneratorBundle\Tests\Fixtures\Controller\CustomController::customItem",
  *         }
  *     },
  *     collectionOperations={
+ *         "get",
+ *         "post",
  *         "custom": {
  *             "method": "POST",
- *             "input": InputDTO::class,
- *             "output": OutputDTO::class,
  *             "controller": "Irstea\NgModelGeneratorBundle\Tests\Fixtures\Controller\CustomController::customCollection",
  *         }
  *     }
diff --git a/tests/Fixtures/Entity/EntityWithDTO.php b/tests/Fixtures/Entity/EntityWithDTO.php
new file mode 100644
index 0000000000000000000000000000000000000000..32015034234da0e1c772287dd1dd920674073d35
--- /dev/null
+++ b/tests/Fixtures/Entity/EntityWithDTO.php
@@ -0,0 +1,72 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of "irstea/ng-model-generator-bundle".
+ *
+ * "irstea/ng-model-generator-bundle" generates Typescript interfaces for Angular using api-platform metadata.
+ * Copyright (C) 2018-2019 IRSTEA
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License and the GNU
+ * Lesser General Public License along with this program. If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\NgModelGeneratorBundle\Tests\Fixtures\Entity;
+
+use ApiPlatform\Core\Annotation as API;
+use Irstea\NgModelGeneratorBundle\Tests\Fixtures\ValueObject\InputDTO;
+use Irstea\NgModelGeneratorBundle\Tests\Fixtures\ValueObject\OutputDTO;
+use Ramsey\Uuid\Uuid;
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * Class EntityWithCustomMethods.
+ *
+ * @API\ApiResource(
+ *     itemOperations={
+ *         "put": {
+ *             "method": "PUT",
+ *             "input": InputDTO::class,
+ *             "output": OutputDTO::class,
+ *         }
+ *     },
+ *     collectionOperations={
+ *         "post": {
+ *             "method": "POST",
+ *             "input": InputDTO::class,
+ *             "output": OutputDTO::class,
+ *         }
+ *     }
+ * )
+ */
+class EntityWithDTO
+{
+    /**
+     * @var UuidInterface
+     * @API\ApiProperty(identifier=true)
+     */
+    private $id;
+
+    public function __construct()
+    {
+        $this->id = Uuid::uuid4();
+    }
+
+    /**
+     * Get id.
+     *
+     * @return UuidInterface
+     */
+    public function getId(): UuidInterface
+    {
+        return $this->id;
+    }
+}
diff --git a/tests/Functional/CustomMethodTest.php b/tests/Functional/CustomMethodTest.php
index b9cd66927a947ea6199fe429c274e642b69445bc..73524b725e2e8db6da40ce7df7f5315c711ce0fa 100644
--- a/tests/Functional/CustomMethodTest.php
+++ b/tests/Functional/CustomMethodTest.php
@@ -44,23 +44,8 @@ final class CustomMethodTest extends GenerationTestCase
     public function listExpectedSnippets(): array
     {
         return [
-            'CustomInputDTO' => [
-                <<<'TYPESCRIPT'
-export interface CustomInputDTO {
-  values: Array<number>;
-}
-TYPESCRIPT
-            ],
-            'OutputDTO' => [
-                <<<'TYPESCRIPT'
-export interface OutputDTO {
-  results: Array<string>;
-  success: boolean;
-}
-TYPESCRIPT
-            ],
-            'CustomItemMethod'       => ['public custom(iri: IRI<EntityWithCustomMethods>, body: CustomInputDTO, options: RequestOptions = {}): Observable<OutputDTO> {'],
-            'CustomCollectionMethod' => ['public customs(body: Array<CustomInputDTO>, options: RequestOptions = {}): Observable<Collection<OutputDTO>> {'],
+            'CustomItemMethod'       => ['public custom(iri: IRI<EntityWithCustomMethods>, body: CustomEntityWithCustomMethods, options: RequestOptions = {}): Observable<EntityWithCustomMethods> {'],
+            'CustomCollectionMethod' => ['public customs(body: Array<CustomEntityWithCustomMethods>, options: RequestOptions = {}): Observable<Collection<EntityWithCustomMethods>> {'],
         ];
     }
 }
diff --git a/tests/Functional/DTOTest.php b/tests/Functional/DTOTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..94926b61a7b45568e3436c57b5ce4b7ac6f8f151
--- /dev/null
+++ b/tests/Functional/DTOTest.php
@@ -0,0 +1,73 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of "irstea/ng-model-generator-bundle".
+ *
+ * "irstea/ng-model-generator-bundle" generates Typescript interfaces for Angular using api-platform metadata.
+ * Copyright (C) 2018-2019 IRSTEA
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License and the GNU
+ * Lesser General Public License along with this program. If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+namespace Irstea\NgModelGeneratorBundle\Tests\Functional;
+
+/**
+ * Class CustomMethodTest.
+ */
+final class DTOTest extends GenerationTestCase
+{
+    /**
+     * @param string $snippet
+     * @param string $code
+     *
+     * @test
+     * @dataProvider listExpectedSnippets
+     */
+    public function checkCodeSnippet(string $snippet): void
+    {
+        self::assertCodeContains($snippet, self::generateTypescript());
+    }
+
+    /**
+     * @return array
+     */
+    public function listExpectedSnippets(): array
+    {
+        return [
+            'PutInputDTO' => [
+                <<<'TYPESCRIPT'
+export interface PutInputDTO {
+  values?: Array<number>;
+}
+TYPESCRIPT
+            ],
+            'PostInputDTO' => [
+                <<<'TYPESCRIPT'
+export interface PostInputDTO {
+  values: Array<number>;
+}
+TYPESCRIPT
+            ],
+            'OutputDTO' => [
+                <<<'TYPESCRIPT'
+export interface OutputDTO {
+  results: Array<string>;
+  success: boolean;
+}
+TYPESCRIPT
+            ],
+            'PutItemMethod'        => ['public put(id: UUID, body: PutInputDTO, options: RequestOptions = {}): Observable<OutputDTO> {'],
+            'PostCollectionMethod' => ['public post(body: PostInputDTO, options: RequestOptions = {}): Observable<OutputDTO> {'],
+        ];
+    }
+}