Де хэвилленд dh.98 «москито»

Mockito: что это такое и зачем нужно

Говоря коротко, Mockito — фреймворк для работы с заглушками.

Как известно, при тестировании кода (прежде всего юнит-тестировании, но не только) тестируемому элементу часто требуется предоставить экземпляры классов, которыми он должен пользоваться при работе. При этом часто они не должны быть полнофункциональными — наоборот, от них требуется вести себя жёстко заданным образом, так, чтобы их поведение было простым и полностью предсказуемым. Они и называются заглушками (stub). Чтобы их получить, можно создавать альтернативные тестовые реализации интерфейсов, наследовать нужные классы с переопределением функционала и так далее, но всё это достаточно неудобно, избыточно и чревато ошибками. Более удобное во всех смыслах решение — специализированные фреймворки для создания заглушек. Одним из таковых (и, пожалуй, самым известным для Java) и является Mockito.

Mockito позволяет создать одной строчкой кода так называемый mock (что-то вроде основы для нужной заглушки) любого класса. Для такого mock сразу после создания характерно некое поведение по умолчанию (все методы возвращают заранее известные значения — обычно это либо ). Можно переопределить это поведение желаемым образом, проконтролировать с нужной степенью детальности обращения к ним так далее. В результате mock и становится заглушкой с требуемыми свойствами. Ниже я подробно разберу, как это сделать.

Отмечу, что mock можно создать и для тех классов, новый экземпляр которых вообще-то так просто не создашь, в частности, классов с исключительно приватными конструкторами типа синглтонов и утилитных классов, а при минимальной настройке фреймворка — и перечислений (enums).

FOREIGN

The Mosquito was operated by many diverse countries in the immediate
postwar period. Some of which are shown here.

Mosquito FB Mk.VI
Nationalist Chinese Air Force
1948-1950

China acquired over 200 Mosquitos, all were Canadian built and of
various marks including the
FB.26 (Canadian-built FB.VI). They eventually
equipped three squadrons, and saw some combat in 1948/49 before the
Nationalist forces retreated to Taiwan. Finish is OD upper surfaces
and medium gray lower.

Mosquito FB Mk.VI RF823
Czechoslovakian Air Force
1945-1950

Following the end of WW2, 19 Mosquito FB.VIs were flown by the Czech
Air Force. Despite an arms embargo, No.311 Sqn managed to keep their
Mosquitos operational by using surplus German guns. During 1950 western
aircraft were phased out in favour of Soviet types, with the Mosquito
being replaced by the Il-2. Standard RAF camouflage is carried with
Czech markings.

Mosquito FB Mk.VI
Dominican Air Force
circa 1950

The Dominican Republic acquired five FB.VIs. Later supplemented by
some T.27s. Although a roundel is shown on the port undersurface, it
is more likely that the serial 2102 was carried here as it appears on
the upper starboard wing, and the roundel on the lower starboard wing
of another Mosquito.

Mosquito NF Mk.XIX 30022
Swedish Air Force
1950

Sweden bought sixty ex-RAF NF.XIX Mosquitos in 1948, and gave them
the designation J30. Upon delivery, the first, second, and third squadrons
of the F1 Wing was equipped with the type and appropriate markings were
painted on; The first squadron had white spinners and code letters,
the second squadron blue spinners and code letters, and the third squadron
yellow spinners and code letters. The letters were outlined in white,
except for the first squadron, which were outlined in black. Later the
first squadron changed from white to red for their colors, outlining
the letters in white. The J30 had a short life in the Flygvapnet, being
in front line service for only 6 years. The J30 was replaced by the
Venom, a much more powerful night-fighter.

Mosquito FB Mk.VI
Turkish Air Force
1947-1950

Turkey purchased 142 Mosquitos, of which 137 were FB.Vis. The Turkish
Air Force operated their Mosquitos until 1954.

Mosquito PR.XVI 90
Israeli Defence Force
Syria, 1956

Israel was one of the last countries to fly the Mosquito into combat,
using ex-French and Royal Navy PR. XVI Mosquitos in the Suez crisis
of 1956. While most Israeli PR Mosquitos were silver overall, a small
number of them were camouflaged in the standard sand and blue over duck
egg green. The Mosquito shown here was flown on a recce mission over
Syria in November of 1956 by Ze’ev Tavor and navigator Rafael Sivron
when it suffered some damage. While it made it back to Israel, the resultant
forced landing effectively wrote off #90.

Обзор

Термин BDD впервые был придуман Дэном Нортом еще в 2006 году.

BDD поощряет написание тестов на естественном, удобочитаемом языке, ориентированных на поведение приложения.

Он определяет четко структурированный способ написания тестов в следующих трех разделах (Arrange, Act, Assert):

  • при некоторых предварительных условиях (организовать)
  • когда происходит действие (действие)
  • затем проверьте вывод (Assert)

Библиотека Mockito поставляется с классом BDDMockito, который представляет BDD-дружественные API. Этот API позволяет нам использовать более дружественный для BDD подход, организуя наши тесты с помощью given () и делая утверждения с помощью then () .

В этой статье мы собираемся объяснить, как настроить тесты Mockito на основе BDD. Мы также поговорим о различиях между API Mockito и BDDMockito , чтобы в конечном итоге сосредоточиться на API BDDMockito .

Stubbing methods

Subbing is defining of what values to return when we invoke methods of a mock object.

Stubbing is achieved by Mockito’s when-thenReturn methods.

Let’s see how to do stubbing for our interface :

package com.logicbig.example;

import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

public class MyServiceTest2 {

  @Test
  public void testDoSomething2(){
      MyService mock = Mockito.mock(MyService.class);
      Mockito.when(mock.doSomething()).thenReturn(10);//stubbing
      int i = mock.doSomething();
      Assert.assertEquals(i, 10);
  }
}
D:\mockito-getting-started-creating-mocks>mvn test -Dtest="MyServiceTest2" Scanning for projects...  ----< com.logicbig.example:mockito-getting-started-creating-mocks >----- Building mockito-getting-started-creating-mocks 1.0-SNAPSHOT -----------------------------------------------------------------  --- maven-resources-plugin:2.6:resources (default-resources) @ mockito-getting-started-creating-mocks --- Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!  --- maven-compiler-plugin:3.8.1:compile (default-compile) @ mockito-getting-started-creating-mocks --- Nothing to compile - all classes are up to date  --- maven-resources-plugin:2.6:testResources (default-testResources) @ mockito-getting-started-creating-mocks --- Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!  --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ mockito-getting-started-creating-mocks --- Nothing to compile - all classes are up to date  --- maven-surefire-plugin:2.12.4:test (default-test) @ mockito-getting-started-creating-mocks ---------------------------------------------------------- T E S T S-------------------------------------------------------Running com.logicbig.example.MyServiceTest2Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.916 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 ------------------------------------------------------------------------ BUILD SUCCESS ------------------------------------------------------------------------ Total time:  4.132 s Finished at: 2020-04-17T00:10:42-05:00 ------------------------------------------------------------------------

BOMBER Mk.IV/FIGHTER Mk.II

Mosquito B Mk.IV DK333
PO Stephens/Ruskell
No.109 Sqn RAF

The first pattern carried by the Mosquitos was that seen on the other
aircraft of Bomber Command — brown/green topsides with black undersurfaces.
Aircraft codes and serials are in dull red.

Mosquito B Mk.IV DZ367
No.105 Sqn RAF

The next pattern seen on Bomber Command Mossies was gray/green upper
surfaces and sky under surfaces along with light gray codes and black
serials.

Mosquito B Mk.IV G-AGFV

During the war, Britain needed to keep in contact with neutral Sweden
for such materials as precision-machined ball bearings and machine-tool
steel. BOAC initially operated a pair of Lockheed Lodestars for this
route, but the performance of the Lodestar resulted in it only being
flown in bad weather and clouds to protect it from fighter interception.
BOAC sought a replacement, and after refusing the government’s suggestions
of Whitleys and Albermarle, the Mosquito was selected. The first BOAC
Mosquitos were B. Mk. IVs, followed by FB. Mk. VIs. With the Mosquito,
interception by the Luftwaffe was unlikely, and the lines of communication
remained open between England and Sweden. G-AGFV is seen in standard
RAF camouflage, the only additions being its civil registration and
a large red/white/blue horizontal stripe on the fuselage.

Mosquito NF Mk.II W4082
No.157 Sqn RAF
March-August 1942

The Mosquito was early on recognized as being suitable for modification
into the fighter role. As such they were fitted with four 20mm cannon
and four .303 machine guns. At the same time the need for night-fighters
was becoming apparent and the Mosquito NF Mk.II was created by mating
the F Mk.II with the Mk.IV AI (Airborne Intercept) radar — the result
being the NF Mk.II. The only external difference was the arrowhead aerial
on the nose and dipoles on the wingtips. These early Mosquitos were
finished in a special matt black paint that was supposed to lessen the
likelihood of being seen at night. Note the type A1 roundel and the
early fin flash.

Mosquito NF Mk.II (Intruder) DD712
No.23 Sqn RAF
November 1942

The desire to take the war to the enemy led to many types of aircraft
being employed in the intruder role. These aircraft roamed over Europe
at night and were directed to cause the maximum disruption to the enemy’s
lines of communications as possible. One favoured tactic was to wait
in the vicinity of a German airfield and shoot down any returning aircraft
careless enough to think it was safely at home. The NF.IIs employed
on this function had their radar removed. . and were to all intents
and purposes standard F Mk.IIs. DD712 shows the next step in NF markings.
. the roundel is now type C1, while the fin flash has had its white
centre stripe reduced in width.

Mosquito NF Mk.II (Intruder) DZ716
No.605 Sqn

For night-fighters, matte black finish was found to less helpful in
concealment at night, Therefore most were refinished in an overall gray
with green disruptive camouflage. However as the NF Mk.II (Intruder)
was still operating in an environment where searchlights were a real
danger, many kept their black bottom surfaces, even after adding the
gray/green uppers.

О статье

Перед вами очередное руководство по Mockito. В нём я, с одной стороны, попытался описать функционал этой библиотеки так, чтобы незнакомый с нею читатель сразу получил возможность полноценно ею пользоваться, а не только общее представление о ней. С другой — я хотел сделать его достаточно компактным и структурированным, чтобы можно было быстро прочесть его целиком и быстро найти в нём что-то единожды прочитанное, но подзабытое. В общем, эта такая статья, какая бы пригодилась мне самому, когда я только столкнулся с этой библиотекой и не очень понимал, как она работает.

Полагаю, она и сейчас может пригодиться мне же — иногда я забываю что-то из этого, а вспоминать материал удобнее всего не по официальной документации или чужим статьям, а по собственному, скажем так, конспекту. Вместе с тем я старался построить текст так, чтобы он был удобен прежде всего для знакомства с Mockito с нуля, и кое-где подробно разбираю вроде бы очевидные вещи — не все из которых были для меня очевидными с самого начала.

Мокинг с помощью BDDMockito

Давайте попробуем протестировать PhoneBookService, где нам нужно будет смоделировать PhoneBookRepository:

BDDMockito как Mockito позволяет нам возвращать значение, которое может быть фиксированным или динамическим. Это также позволит нам выбросить исключение:

4.1. Возврат фиксированной стоимости

Используя BDDMockito, мы могли бы легко настроить Mockito для возврата фиксированного результата всякий раз, когда вызывается наш целевой метод фиктивного объекта:

4.2. Возврат динамического значения

BDDMockito позволяет нам предоставлять более изощренный способ возврата значений. Мы можем вернуть динамический результат на основе ввода:

4.3. Выброс исключения

Сказать Mockito создать исключение довольно просто:

Обратите внимание на то, как мы поменяли местами значения given и will * , что обязательно, если мы имитируем метод, который не имеет возвращаемого значения. Также обратите внимание, что мы использовали сопоставители аргументов, такие как ( any , eq ), чтобы предоставить более общий способ насмешки, основанный на критериях, а не на фиксированном значении

Также обратите внимание, что мы использовали сопоставители аргументов, такие как ( any , eq ), чтобы предоставить более общий способ насмешки, основанный на критериях, а не на фиксированном значении

Модули

  • Таблица
  • Дерево

Двигатель

Уровень Двигатель Мощность двигателя, л.с. / Тяга Тип Масса, кг Стоимость,
VII NAME_MODULE_MERLIN-225_PR_SPEC_TOP_MOSQUITO-MK26_1 1620 водяного охлаждения 1500 80000

Конструкция

Уровень Конструкция Живучесть Масса, кг Стоимость,
VI NAME_MODULE_MOSQUITO-MK26_PLANER-PR_SPEC_TOP_MOSQUITO-MK26_1 400 6400 60000

Фюзеляжное вооружение

Уровень Пулемёт Калибр Начальная скорость снаряда, м/с Урон Скорострельность, выстр/мин Масса, кг Стоимость,
VI 20-мм Hispano Mk.II (Ф) 20 1360 90 400 90 37300

Фюзеляжное вооружение

Уровень Пулемёт Калибр Начальная скорость снаряда, м/с Урон Скорострельность, выстр/мин Масса, кг Стоимость,
IV WEAPON_NAME_G7MM-BROWNING-MK-2-CH-PR-F_SPEC_TOP_MOSQUITO-MK26_1 7.7 960 25 600 30 4500

Подвесное вооружение

Уровень Бомбы Радиус поражения, м Урон Масса, кг Стоимость,
VI WEAPON_NAME_500LB-CH-PR_SPEC_TOP_MOSQUITO-MK26_1 75 4300 227 1150

Подвесное вооружение

Уровень Ракеты Радиус поражения, м Урон Масса, кг Стоимость,
VI RP-3 SAP 35 1000 37 500

Двигатель

VII

ДвигательNAME_MODULE_MERLIN-225_PR_SPEC_TOP_MOSQUITO-MK26_1

Характеристики:
Мощность двигателя, л.с. 1620
Тип водяного охлаждения
Масса, кг 1500

Применяемость:De Havilland 98 Mosquito FB 26

VII

2xNAME_MODULE_MERLIN-225_PR_SPEC_TOP_MOSQUITO-MK26_1

VII

ДвигательMerlin 225

Характеристики:
Мощность двигателя, л.с. 1620
Тип водяного охлаждения
Масса, кг 1500

Применяемость:De Havilland 98 Mosquito FB 26

VII

2xMerlin 225

Конструкция

VI

КонструкцияNAME_MODULE_MOSQUITO-MK26_PLANER-PR_SPEC_TOP_MOSQUITO-MK26_1

Характеристики:
Живучесть 400
Масса, кг 6400

Применяемость:De Havilland 98 Mosquito FB 26

VI

NAME_MODULE_MOSQUITO-MK26_PLANER-PR_SPEC_TOP_MOSQUITO-MK26_1

VI

КонструкцияMosquito FB 26

Характеристики:
Живучесть 400
Масса, кг 6400

Применяемость:De Havilland 98 Mosquito FB 26

VI

Mosquito FB 26

Фюзеляжное вооружение

VI

Пулемёт20-мм Hispano Mk.II (Ф)

Характеристики:
Калибр 20
Начальная скорость снаряда, м/с 1360
Урон 90
Скорострельность, выстр/мин 400
Масса, кг 90

Применяемость:De Havilland 98 Mosquito FB 26

VI

4×20-мм Hispano Mk.II (Ф)

VI

Пулемёт

Характеристики:
Калибр 20
Начальная скорость снаряда, м/с 1360
Урон 90
Скорострельность, выстр/мин 400
Масса, кг 90
Стоимость:
Стоимость покупки 37300

Применяемость:De Havilland 98 Mosquito FB 26

VI

4x

Фюзеляжное вооружение

IV

Пулемёт.303 Browning Mk.II (Ф)

Характеристики:
Калибр 7.7
Начальная скорость снаряда, м/с 960
Урон 25
Скорострельность, выстр/мин 600
Масса, кг 30

Применяемость:De Havilland 98 Mosquito FB 26

IV

4x.303 Browning Mk.II (Ф)

IV

ПулемётWEAPON_NAME_G7MM-BROWNING-MK-2-CH-PR-F_SPEC_TOP_MOSQUITO-MK26_1

Характеристики:
Калибр 7.7
Начальная скорость снаряда, м/с 960
Урон 25
Скорострельность, выстр/мин 600
Масса, кг 30
Стоимость:
Стоимость покупки 4500

Применяемость:De Havilland 98 Mosquito FB 26

IV

4xWEAPON_NAME_G7MM-BROWNING-MK-2-CH-PR-F_SPEC_TOP_MOSQUITO-MK26_1

Подвесное вооружение

Вооружение отсутствует

VI

Бомбы500 фн.

Характеристики:
Радиус поражения, м 75
Урон 4300
Масса, кг 227
Стоимость:
Стоимость покупки 1150

Применяемость:De Havilland 98 Mosquito FB 26

VI

2×500 фн.

VI

БомбыWEAPON_NAME_500LB-CH-PR_SPEC_TOP_MOSQUITO-MK26_1

Характеристики:
Радиус поражения, м 75
Урон 4300
Масса, кг 227
Стоимость:
Стоимость покупки 1150

Применяемость:De Havilland 98 Mosquito FB 26

VI

2xWEAPON_NAME_500LB-CH-PR_SPEC_TOP_MOSQUITO-MK26_1

Вооружение отсутствует

Подвесное вооружение

Вооружение отсутствует

VI

РакетыRP-3 SAP

Характеристики:
Радиус поражения, м 35
Урон 1000
Масса, кг 37
Стоимость:
Стоимость покупки 500

Применяемость:De Havilland 98 Mosquito FB 26

VI

8xRP-3 SAP

VI

Ракеты

Характеристики:
Радиус поражения, м 35
Урон 1000
Масса, кг 37
Стоимость:
Стоимость покупки 500

Применяемость:De Havilland 98 Mosquito FB 26

VI

8x

Вооружение отсутствует

Вооружение отсутствует

Премиумный самолет
Подарочный самолет

mock и spy

Центральный класс Mockito, через который предполагается обращаться к большей части функционала, — это, собственно, класс под названием (есть также класс , предоставляющий примерно те же возможности в форме, более подходящей для BDD, но здесь я не стану на нём останавливаться). Доступ к функционалу реализован через его статические методы.

Чтобы создать mock класса , я должен сделать всего лишь следующее:

Готово — я получил экземпляр нужного мне класса. Он будет принят любым методом или конструктором, которому требуется параметр такого типа (например, конструктором того класса, который я хочу протестировать). Даже если далее его ожидает проверка с пристрастием, он её пройдёт: не только вернёт , но и — именно . Каким-то формальным образом программно отличить mock-объект от обычного оказывается довольно непростой задачей, что и логично: ведь первый предназначен как раз для того, чтобы быть неотличимым от второго. Однако в составе Mockito для этого есть инструмент — метод . Передав ему произвольный объект, я получу объект класса . Он содержит информацию о том, что этот объект представляет собой с точки зрения Mockito: является ли он mock, spy (см. ниже), как использовался, как был создан и прочее.

Особо нужно упомянуть ситуацию, когда я пытаюсь создать mock для final класса или mock-экземпляр enum либо переопределить поведение final метода. В таком случае при поведении Mockito по умолчанию код выше откажется работать, сославшись именно на это обстоятельство. Однако это можно изменить — достаточно создать в проекте (при стандартном устройстве проектного дерева каталогов) файл и вписать в него строчку:

После этого можно имитировать обычным способом final классы и enum’ы, а также переопределять final методы.

Полученный мной mock в действии максимально безлик: ни один метод при вызове не окажет никакого воздействия на что бы то ни было, а возвращённое значение окажется для объектных типов и для примитивных

Обратите внимание: если метод возвращает коллекцию, mock’ом по умолчанию будут возвращены не ‘ы, а пустые экземпляры коллекций. Например, для это окажется пустой независимо от того, что должен был возвращать реальный метод

А вот в качестве значений массивов, примитивных или объектных, я получу . Поведение по умолчанию (и не только его) можно изменить при помощи функционала класса , но это нечасто бывает нужно.

Так или иначе, в большинстве случаев мне понадобится не поведение по умолчанию, и в следующем разделе я подробно разберу, как задавать вместо него то, которое требуется.

Однако что, если я хочу использовать в качестве заглушки объект реального класса с имеющимся функционалом, переопределив работу только части его методов? Если речь о юнит-тестировании, такая потребность обычно (но не всегда) свидетельствует о том, что в проекте не всё в порядке с дизайном, и в принципе так действовать не рекомендуется. Однако случаются ситуации, когда этого по какой-то причине не избежать. На этот случай в Mockito есть так называемые spy, «шпионы». В отличие от mock’ов, их можно создавать на основе как класса, так и готового объекта:

При создании spy на основе класса, если его тип — интерфейс, будет создан обычный mock-объект, а если тип — класс, то Mockito попытается создать экземпляр при помощи конструктора по умолчанию (без параметров). И только если такого конструктора нет, произойдёт ошибка и тест не сработает.

Поведение spy-объектов по умолчанию идентично поведению обычного экземпляра класса, однако они дают мне те же возможности, что и mock-объекты: позволяют переопределять их поведение и наблюдать за их использованием (см. следующие разделы). Важный момент: spy — не обёртка вокруг того экземпляра, на основе которого он создан! Поэтому вызов метода spy на состояние изначального экземпляра не повлияет.

Benefits of Mockito

  • No Handwriting − No need to write mock objects on your own.

  • Refactoring Safe − Renaming interface method names or reordering parameters will not break the test code as Mocks are created at runtime.

  • Return value support − Supports return values.

  • Exception support − Supports exceptions.

  • Order check support − Supports check on order of method calls.

  • Annotation support − Supports creating mocks using annotation.

Consider the following code snippet.

package com.tutorialspoint.mock;

import java.util.ArrayList;
import java.util.List;

import static org.mockito.Mockito.*;

public class PortfolioTester {
   public static void main(String[] args){

      //Create a portfolio object which is to be tested		
      Portfolio portfolio = new Portfolio();

      //Creates a list of stocks to be added to the portfolio
      List<Stock> stocks = new ArrayList<Stock>();
      Stock googleStock = new Stock("1","Google", 10);
      Stock microsoftStock = new Stock("2","Microsoft",100);

      stocks.add(googleStock);
      stocks.add(microsoftStock);		

      //Create the mock object of stock service
      StockService stockServiceMock = mock(StockService.class);

      // mock the behavior of stock service to return the value of various stocks
      when(stockServiceMock.getPrice(googleStock)).thenReturn(50.00);
      when(stockServiceMock.getPrice(microsoftStock)).thenReturn(1000.00);

      //add stocks to the portfolio
      portfolio.setStocks(stocks);

      //set the stockService to the portfolio
      portfolio.setStockService(stockServiceMock);

      double marketValue = portfolio.getMarketValue();

      //verify the market value to be 
      //10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
      System.out.println("Market value of the portfolio: "+ marketValue);
   }
}

Let’s understand the important concepts of the above program. The complete code is available in the chapter First Application.

  • Portfolio − An object to carry a list of stocks and to get the market value computed using stock prices and stock quantity.

  • Stock − An object to carry the details of a stock such as its id, name, quantity, etc.

  • StockService − A stock service returns the current price of a stock.

  • mock(…) − Mockito created a mock of stock service.

  • when(…).thenReturn(…) − Mock implementation of getPrice method of stockService interface. For googleStock, return 50.00 as price.

  • portfolio.setStocks(…) − The portfolio now contains a list of two stocks.

  • portfolio.setStockService(…) − Assigns the stockService Mock object to the portfolio.

  • portfolio.getMarketValue() − The portfolio returns the market value based on its stocks using the mock stock service.

Ссылки

Ресурсы World of Warplanes
  • Энциклопедия
  • Тема на официальном форуме

Великобритания

Истребители IIBristol Bulldog • IIIBristol Type 133 • IIIHawker P.V.3 • IIISupermarine Type 224 • IVBristol Type 146 • IVFairey Fantome • IVHawker Hurricane Mk. Ia • VCAC CA-12 Boomerang • VMiles M.20 • VSupermarine Spitfire I • VSupermarine Spitfire Mk Ia • VVickers Venom • VINorth American Mustang Mk.I • VINorth American Mustang IA • VISupermarine Spitfire V • VISupermarine Spitfire Vb IM • VIIGloster Meteor F. I • VIISupermarine Spitfire IX • VIIISupermarine Spitfire XIV • VIIIDe Havilland DH.100 Vampire F.1 • IXSupermarine Attacker • XSupermarine Swift
Тяжёлые истребители IVBristol Blenheim F • VBristol Beaufighter • VIDe Havilland 98 Mosquito • VIIDe Havilland 103 Hornet • VIIIWestland P.1056 • IXGloster P.228 • XGloster Javelin
Многоцелевые истребители IGloster Goldfinch • IIHawker Demon • IIIBlackburn Skua • IVHawker Hurricane Mk I • VHawker Hurricane Mk II • VHawker Hurricane IID • VIHawker Tornado • VIIHawker Typhoon • VIIISupermarine Seafang F.32 • VIIIHawker Tempest • IXHawker Sea Hawk • XHawker Hunter
Штурмовики IIICAC CA-1 Wirraway
Бомбардировщики IIIBristol Blenheim Mk.IV (ранний)

Тяжёлые истребители

СССР VIIТуполев Ту-1
Германия IIAGO Ao 192 Kurier • IIIDornier Do 17 Z-7 Kauz • IIIFocke-Wulf Fw 57 • IIIJunkers Ju 52 • IVMesserschmitt Bf 110 B • IVMesserschmitt Bf 110 C-6 • VMesserschmitt Bf 110 E • VMesserschmitt Me 210 • VIMesserschmitt Me 410 Hornisse • VIIMesserschmitt Bf 109 Z Zwilling • VIIIBlohm und Voss BV P.203 • VIIIDornier Do 335 A-1 Pfeil • VIIIMesserschmitt Me 262 Schwalbe • IXMesserschmitt Me 262 HG II • XMesserschmitt Me 262 HG III
Великобритания IVBristol Blenheim F • VBristol Beaufighter • VIDe Havilland 98 Mosquito • VIIDe Havilland 103 Hornet • VIIIWestland P.1056 • IXGloster P.228 • XGloster Javelin
США VLockheed P-38F Lightning • VILockheed P-38J Lightning • VIGrumman XP-50 • VIIGrumman F7F Tigercat • VIIFisher XP-75 Eagle • VIIIChance-Vought XF5U Pancake • VIIINorth American P-82B Twin Mustang • VIIILockheed XP-58 Chain Lightning • IXMcDonnell F2H Banshee • XLockheed XF-90
Япония VKawasaki Ki-45 Toryu • VIKawasaki Ki-102 • VIIRikugun Ki-93 • VIITachikawa Ki-94-I
Китай VIDe Havilland 98 Mosquito FB 26
Франция VSNCASE SE 100 • VIIArsenal VB 10
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector